【问题标题】:Merging Table A and B using only columns from Table A in R仅使用 R 中表 A 中的列合并表 A 和 B
【发布时间】:2019-04-02 10:30:46
【问题描述】:

我有 2 个数据框 A 和 B,其中 A 中的列是 B 中的列的子集,如下所示

表 A:

[A] [B] [C]
 1   2   3
 4   5   6

表 B:

[A] [B] [C] [D]
 7   8   9  10
11  12  13  14

我希望得到这样的输出:

[A] [B] [C]
 1   2   3
 4   5   6
 7   8   9
11  12  13

我应该使用什么样的代码/函数来直接得到这样的结果?

我尝试了rbind.fill,但我从 A 和 B 中获得了所有不同的列,以后我可以删除其中的一些。 但是,我的实际数据包含太多列,因此简单地输入所有不需要的列并不是最佳选择。

如果尝试一次性获得我想要的结果真的很不明智,那么欢迎使用其他快速解决方法 =D。谢谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以在B 中找到存在于A 中的列,然后在rbind 中找到这些列。

    cols <- names(B)[names(B) %in% names(A)] 
    rbind(A, B[cols])
    
    #   A  B  C
    #1  1  2  3
    #2  4  5  6
    #3  7  8  9
    #4 11 12 13
    

    如果AB 都可以有不同的列,我们可以使用intersect 找到共同的列

    cols <- intersect(names(B), names(A))
    rbind(A[cols], B[cols])
    

    数据

    A <- structure(list(A = c(1L, 4L), B = c(2L, 5L), C = c(3L, 6L)), class 
    = "data.frame", row.names = c(NA, 
    -2L))
    B <- structure(list(A = c(7L, 11L), B = c(8L, 12L), C = c(9L, 13L), 
    D = c(10L, 14L)), class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

      【解决方案2】:

      如果您使用 tidyverse,您可以这样做:

      library(tidyverse)
      
      bind_rows(a, b[names(a)])
      

      或者

      bind_rows(a, b %>% select(names(a))
      

      生成数据

      a <- tribble(
          ~A, ~B, ~C,
          1, 2, 3,
          4, 5, 6,
      )
      
      b <- tribble(
          ~A, ~B, ~C, ~D,
          7,8,9,10,
          11,12,13,14
      )
      

      【讨论】:

        猜你喜欢
        • 2011-12-23
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2021-03-10
        • 2020-07-10
        相关资源
        最近更新 更多