【问题标题】:In two data.frames in R, find values in one data.frame, based on multiple variables in the other data.frame [duplicate]在R中的两个data.frame中,根据另一个data.frame中的多个变量在一个data.frame中查找值[重复]
【发布时间】:2020-10-29 01:11:32
【问题描述】:

上一个问题已关闭,但简单的解决方案似乎不起作用。所以我在这里进一步解释了我的问题。

我有两个数据框,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() 也不起作用,因为我必须选择多个变量(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。有人知道如何解决这个问题吗?

最好的问候,

约翰

【问题讨论】:

    标签: r select inner-join tapply


    【解决方案1】:

    我相信这会很有用:

    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
    

    【讨论】:

      【解决方案2】:

      我相信这可以解决您的问题。我希望这会有所帮助:

      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
      

      【讨论】:

        【解决方案3】:

        Duck 和 codez0mb1e 的答案都有效,当添加 %&gt;% 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 的可能误解中的反馈!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-03
          • 1970-01-01
          相关资源
          最近更新 更多