首页 文章

如何通过第三个键变量(R)将来自不同数据帧的两列合并为一个新数据帧

提问于
浏览
-1

我有这两个数据帧:

df1 < - data.frame(a = c(1,2,3,1,2,3,1,2,3),b = c(11,21,31,12,22,32,13,23, 33))

df2 < - data.frame(a = c(1,2,3,1,2,3,1,2,3),c = c(101,201,301,102,202,302,103,203,303))

我想将列“b”和“c”合并到一个新的数据帧中,但使用“a”作为关键变量 .

预期的结果如下:

df.output < - data.frame(b = c(21,22,23),c = c(201,202,203))

我已经尝试了dplyr的join函数,但是我们已经成功了 .

谢谢,

quelemem

2 回答

  • 0

    Edit

    根据OP的其他评论,调整原始解决方案可以实现所需的输出(尽管我认为@akrun's答案在这种情况下更好的选择,因为不需要 nest / unnest ) .

    library(tidyverse)
    left_join(nest(df1, -a), nest(df2, -a), by = "a") %>% 
      filter(a == 2) %>% unnest() %>% select(-a)
    #>    b   c
    #> 1 21 201
    #> 2 22 202
    #> 3 23 203
    

    Original answer

    正如@akrun在评论中提到的那样,期望的输出并不完全清楚 . 你的意思是这样的输出吗?

    library(tidyverse)
    df3 <- left_join(nest(df1, -a), nest(df2, -a), by = "a")
    df3
    #>   a     data.x        data.y
    #> 1 1 11, 12, 13 101, 102, 103
    #> 2 2 21, 22, 23 201, 202, 203
    #> 3 3 31, 32, 33 301, 302, 303
    
  • 0

    基于OP在评论中提到的逻辑,我们可以'a'只有'a'中的行值为2,然后 mutate 列'c'通过获取相应的'c'值'a'是2

    library(dplyr)
    df1 %>%
       filter(a == 2) %>%
       mutate(c = df2$c[a ==df2$a]) %>%
       select(-a)
    #   b   c
    #1 21 201
    #2 22 202
    #3 23 203
    

    或使用 base R

    cbind(subset(df1, a==2, select = b), subset(df2, a==2, select = c))
    

相关问题