在 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 的可能误解提出的反馈!