我有以下数据框:
> df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'))
> df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA))
> df1
ind x
1 1 a
2 2 b
3 3 <NA>
4 4 d
> df2
ind x
1 1 <NA>
2 2 <NA>
3 3 c
4 4 <NA>
我希望通过df2中的数值将它们组合在df1中填充缺失值。我怎样才能做到这一点?我既不能使用merge也不能使用join命令:
> merge(df1, df2, by='ind', all=T)
ind x.x x.y
1 1 a <NA>
2 2 b <NA>
3 3 <NA> c
4 4 d <NA>
答案 0 :(得分:3)
构建测试用例的方式会产生因素,并且会给紧凑型解决方案带来额外的障碍,因为这些级别并不一致。您可以创建具有levels =其唯一值的并集的因子,或者最好使用字符向量:
df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'), stringsAsFactors=FALSE)
df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA), stringsAsFactors=FALSE)
df1[is.na(df1)] <- df2[is.na(df1)] # the key is same index on both sides
df1
#---------
ind x
1 1 a
2 2 b
3 3 c
4 4 d
可以说不太受欢迎的方法(但对于你不想重新处理的一对就地数据集可能更好)是:
df1$x <- factor(df1$x, levels=union(levels(df1$x), levels(df2$x) ) )
df2$x <- factor(df2$x, levels=union(levels(df1$x), levels(df2$x) ) )
df1[is.na(df1)] <- df2[is.na(df1)]
答案 1 :(得分:1)
这个怎么样:
rbind(df1[complete.cases(df1),],df2[complete.cases(df2),])
index x
1 1 a
2 2 b
3 3 c
4 4 d
答案 2 :(得分:1)
如果两个数据集中x
为NA
,您会怎么做?这样做你想要的吗?
x <- merge(df1, df2, all = TRUE, by = "ind")
x <- transform(x, newcol = ifelse(is.na(x.x), as.character(x.y), as.character(x.x)))
> x
ind x.x x.y newcol
1 1 a <NA> a
2 2 b <NA> b
3 3 <NA> c c
4 4 d <NA> d