在 R 中的两个 data.frames 中,根据另一个 data.frame 中的多个变量在一个 data.frame 中找到值
In two data.frames in R, find values in one data.frame, based on multiple variables in the other data.frame
上一个问题已关闭,但简单的解决方案似乎不起作用。所以我在这里进一步解释了我的问题。
我有两个数据帧,df1 和 df2。 df1 有很多原始数据,df2 有基于“value_a”的指针,在哪里查看原始数据。
df1 <- data.frame("id" = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), "value_a" = c(0, 10, 21, 30, 43, 53, 69, 81, 93, 5, 16, 27, 33, 45, 61, 75, 90, 2, 11, 16, 24, 31, 40, 47, 60, 75, 88), "value_b" = c(100, 101, 100, 95, 90, 85, 88, 84, 75, 110, 105, 106, 104, 95, 98, 96, 89, 104, 104, 104, 103, 106, 103, 101, 99, 98, 97), "value_c" = c(0, -1, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 1, 1, 2, 2, 1, -1, 0, 0, 1, 1, 2, 2, 1, 1, 0), "value_d" = c(1:27))
df2 <- data.frame("id" = c(1, 2, 3), "value_a" = c(53, 45, 47))
我想使用 df2 中的值在 df1 中进行搜索。所以,对于每个“id”,它是 df2 中给出的唯一“value_a”,在 df1 中找到相应的“value_b”和“value_c”,这样我就可以生成一个 df3,它看起来像这样:
df3 <- data.frame("id" = c(1, 2, 3), "value_a" = c(53, 45, 47), "value_b" = c(85, 95, 101), "value_c" = c(-2, 1, 2))
显然,我有数百个“id”要涵盖。因为我想找到多个变量(“value_b”、“value_c”而不是“value_d”),所以 pull()
不会起作用,因为它只提取一个变量。
基于 this page 我开始考虑加入。
innerjoin()
也不起作用,因为我必须 select 多个变量 (id & value_a)。像这样合并
df3 <- merge(x = df1, y = df2, by.x = c(id, value_a), by.y = c(id, value_a)) %>%
select(id, value_a, value_b, value_c)
可能描述了我的想法,但这会引发错误:Error in fix.by(by.x, x) : object 'value_a' not found
我也在考虑使用 tapply()
,但我坚持使用两个不同的 data.frames。有人知道如何解决这个问题吗?
此致,
约翰
我相信这可以解决您的问题。希望对您有所帮助:
merge(df2,df1,by.x=c('id','value_a'),by.y=c('id','value_a'),all.x=T)
id value_a value_b value_c value_d
1 1 53 85 -2 6
2 2 45 95 1 14
3 3 47 101 2 24
我相信这会有用:
df2 %>%
inner_join(df1, by = c("id"="id", "value_a"="value_a"))
输出:
id value_a value_b value_c value_d
1 1 53 85 -2 6
2 2 45 95 1 14
3 3 47 101 2 24
Duck 和 codez0mb1e 的两个答案都有效,当添加 %>% select(id, value_a, value_b, value_c)
他们给出输出
id value_a value_b value_c
1 1 53 85 -2
2 2 45 95 1
3 3 47 101 2
感谢您对我对 innerjoin()
和 merge
的可能误解提出的反馈!
上一个问题已关闭,但简单的解决方案似乎不起作用。所以我在这里进一步解释了我的问题。
我有两个数据帧,df1 和 df2。 df1 有很多原始数据,df2 有基于“value_a”的指针,在哪里查看原始数据。
df1 <- data.frame("id" = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), "value_a" = c(0, 10, 21, 30, 43, 53, 69, 81, 93, 5, 16, 27, 33, 45, 61, 75, 90, 2, 11, 16, 24, 31, 40, 47, 60, 75, 88), "value_b" = c(100, 101, 100, 95, 90, 85, 88, 84, 75, 110, 105, 106, 104, 95, 98, 96, 89, 104, 104, 104, 103, 106, 103, 101, 99, 98, 97), "value_c" = c(0, -1, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 1, 1, 2, 2, 1, -1, 0, 0, 1, 1, 2, 2, 1, 1, 0), "value_d" = c(1:27))
df2 <- data.frame("id" = c(1, 2, 3), "value_a" = c(53, 45, 47))
我想使用 df2 中的值在 df1 中进行搜索。所以,对于每个“id”,它是 df2 中给出的唯一“value_a”,在 df1 中找到相应的“value_b”和“value_c”,这样我就可以生成一个 df3,它看起来像这样:
df3 <- data.frame("id" = c(1, 2, 3), "value_a" = c(53, 45, 47), "value_b" = c(85, 95, 101), "value_c" = c(-2, 1, 2))
显然,我有数百个“id”要涵盖。因为我想找到多个变量(“value_b”、“value_c”而不是“value_d”),所以 pull()
不会起作用,因为它只提取一个变量。
基于 this page 我开始考虑加入。
innerjoin()
也不起作用,因为我必须 select 多个变量 (id & value_a)。像这样合并
df3 <- merge(x = df1, y = df2, by.x = c(id, value_a), by.y = c(id, value_a)) %>%
select(id, value_a, value_b, value_c)
可能描述了我的想法,但这会引发错误:Error in fix.by(by.x, x) : object 'value_a' not found
我也在考虑使用 tapply()
,但我坚持使用两个不同的 data.frames。有人知道如何解决这个问题吗?
此致,
约翰
我相信这可以解决您的问题。希望对您有所帮助:
merge(df2,df1,by.x=c('id','value_a'),by.y=c('id','value_a'),all.x=T)
id value_a value_b value_c value_d
1 1 53 85 -2 6
2 2 45 95 1 14
3 3 47 101 2 24
我相信这会有用:
df2 %>%
inner_join(df1, by = c("id"="id", "value_a"="value_a"))
输出:
id value_a value_b value_c value_d
1 1 53 85 -2 6
2 2 45 95 1 14
3 3 47 101 2 24
Duck 和 codez0mb1e 的两个答案都有效,当添加 %>% select(id, value_a, value_b, value_c)
他们给出输出
id value_a value_b value_c
1 1 53 85 -2
2 2 45 95 1
3 3 47 101 2
感谢您对我对 innerjoin()
和 merge
的可能误解提出的反馈!