我正在尝试解决与R中两个数据帧相关的小问题。我有两个数据框D1
和D2
:
D1
ID I1 I2 I3
1 001 1 2 9
2 002 3 5 9
3 003 8 7 9
D2
ID I1 I2 I3
1 001 NA 1 NA
2 002 1 1 NA
3 003 NA NA 1
这些数据框是使用下一个代码生成的:
D1=data.frame(ID=c("001","002","003"),I1=c(1,3,8),I2=c(2,5,7),I3=c(9,9,9),stringsAsFactors=FALSE)
D2=data.frame(ID=c("001","002","003"),I1=c(NA,1,NA),I2=c(1,1,NA),I3=c(NA,NA,1),stringsAsFactors=FALSE)
数据框D2
包含NA
和非NA
值的行。因此,我想将NA
中的非D2
值替换为D1
中各自的值。例如,非D2
中第二列NA
的第一行,因此该值应替换为2
中的D2
。我尝试使用以下代码在NA
中构建包含非D2
值的矩阵:
mm=!is.na(D2[-1])
I1 I2 I3
[1,] FALSE TRUE FALSE
[2,] TRUE TRUE FALSE
[3,] FALSE FALSE TRUE
但是当我试图用这样的D1[mm]
代码替换时,我没有得到预期的结果。我想得到这样的东西:
ID I1 I2 I3
1 001 NA 2 NA
2 002 3 5 NA
3 003 NA NA 9
谢谢!
答案 0 :(得分:2)
尝试以下方法:
D2[!is.na(D2)] <- D1[!is.na(D2)]
D2
ID I1 I2 I3
1 001 <NA> 2 <NA>
2 002 3 5 <NA>
3 003 <NA> <NA> 9
答案 1 :(得分:0)
@ DatamineR的解决方案也是我想到的第一个解决方案,但是将data.frames索引为向量会产生不幸的影响,这会将原子类型提升为字符(由于ID列),你可能不会想。
这是一种保留I1-3列数字性的替代方法:
aggregate(.~ID,rbind(D1,D2),function(a) if (is.na(a[2])) NA else a[1],na.action=na.pass);
## ID I1 I2 I3
## 1 001 NA 2 NA
## 2 002 3 5 NA
## 3 003 NA NA 9