替换R中两个数据帧之间的值

时间:2015-04-22 21:48:53

标签: r

我正在尝试解决与R中两个数据帧相关的小问题。我有两个数据框D1D2

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

谢谢!

2 个答案:

答案 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