【问题标题】:Merge 2 dataframes with all.x = TRUE (except for NA's in x) in R在 R 中合并 2 个具有 all.x = TRUE 的数据帧(x 中的 NA 除外)
【发布时间】:2019-11-04 15:10:42
【问题描述】:

我有两个大型数据框。它们的一个最小的、可重现的示例如下所示:

A <- data.frame(A=c("a","b","c","d"), B=c(1,2,3,4), C=c(1,2,NA,NA), D=c(1,2,3,4))
A

  A B  C D
1 a 1  1 1
2 b 2  2 2
3 c 3 NA 3
4 d 4 NA 4

B <- data.frame(A=c("c","d"), B=c(3,4), C=c(3,4))
B

  A B C
1 c 3 3
2 d 4 4

对于 A 中具有 NA 的每一行,我在 B 中都有一个对应的行,用于替换缺失值。我想将两个数据框 A 和 B 合并到一个“通用”数据框 AB 中,将数据框 A 列 C 中的 NA 替换为数据框 B 列 C 中的相应值。结果应如下所示:

AB <- data.frame(A=c("a","b","c","d"), B=c(1,2,3,4), C=c(1,2,3,4), D=c(1,2,3,4))
AB

  A B C D
1 a 1 1 1
2 b 2 2 2
3 c 3 3 3
4 d 4 4 4

我得到解决方案的“最接近”(也不是那么接近)是使用以下代码:

AB <- merge(A,B, all.x = TRUE)
AB

  A B  C D
1 a 1  1 1
2 b 2  2 2
3 c 3 NA 3
4 d 4 NA 4

显然,它只使用了 A 中的变量。我已经咨询了以下问题:

请考虑实际数据帧要大得多。如果您需要任何进一步的信息,请告诉我。提前致谢!

【问题讨论】:

  • C 是唯一需要替换的列,还是需要扩展到更多列组合?
  • 感谢您的提问。 C 是唯一需要替换的列。

标签: r dataframe join merge


【解决方案1】:

使用data.table-package,您可以执行更新连接,它应该在大型数据集上快速运行。

library(data.table)
#set A and B as data.table
setDT(A);setDT(B)
#update col C in data.table A with col C from data.table B, join by cols A and B
A[ B, C := i.C, on = .( A, B) ]

输出

#    A B C D
# 1: a 1 1 1
# 2: b 2 2 2
# 3: c 3 3 3
# 4: d 4 4 4

【讨论】:

    【解决方案2】:

    你可以在base做这样的事情:

    index <- match(B$A, A$A) 
    
    A$C[index] <- B$C
    
    # A B C D
    #1 a 1 1 1
    #2 b 2 2 2
    #3 c 3 3 3
    #4 d 4 4 4
    

    【讨论】:

      【解决方案3】:

      rbind(data.frame(na.omit(A)), B)

      【讨论】:

      • 如果你能解释它的作用和它的工作原理会很有帮助,但它似乎错过了 OP 想要的目的 - 他们不只是在寻找行绑定,因为会错过更换问题
      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2017-12-30
      • 2020-10-26
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多