我有两个大数据框。最小的,可复制的示例如下所示:
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中的变量。我已经咨询了以下问题:
请考虑实际数据帧要大得多。如果您需要任何其他信息,请告诉我。预先感谢!
答案 0 :(得分:1)
使用data.table
软件包,您可以执行一个update-join,它应在大型数据集上快速运行。
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
答案 1 :(得分:1)
您可以在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
答案 2 :(得分:-1)
rbind(data.frame(na.omit(A)), B)