【发布时间】:2017-06-02 17:57:08
【问题描述】:
我有一个包含 NA 值的面板数据。我想用其他数据的值填写 NA。假设我想用new.df 完成以下panel。
panel <- data.frame("time" = c(rep(2000,5), rep(2001,5)),
"var1" = rep(1:5, times=2),
"var2" = c(NA,'b','c',NA,'d','a1','b1','c1',NA,'d1'))
new.df <- data.frame("time" = c(2000:2001),
"var1" = c(4,4),
"var2" = c('e','e'))
我尝试了合并/聚合/ddplyr 等的不同组合。问题是merge 或merge.data.frame 创建了由.x 和.y 索引的附加列,即使列名相同。
> merge(panel,new.df,by = c("time","var1"), all=T)
time var1 var2.x var2.y
1 2000 1 <NA> <NA>
2 2000 2 b <NA>
3 2000 3 c <NA>
4 2000 4 <NA> e
5 2000 5 d <NA>
6 2001 1 a1 <NA>
7 2001 2 b1 <NA>
8 2001 3 c1 <NA>
9 2001 4 <NA> e
10 2001 5 d1 <NA>
我还尝试使用na.action 选项但没有成功,因为合并后面板仍然不完整,而剩余的NA必须保持原样。 (根据配方,在某些情况下,NA 处理将用0 或NaN 替换NA)
我想找到一种方法将面板中的正确索引定位到正确的位置“插入”new.df$var2,因为我知道我有一个非常大的面板,并且它最终会保持不完整。
提前致谢。
【问题讨论】:
-
为什么要使用
cbind而不是data.frame创建这些数据集?这是故意的吗? -
我建议您检查this 答案,因为它可以让您一次更新任意多的列。类似
cols <- setdiff(colnames(new.df), c("time", "var1")) ; library(data.table) ; setDT(panel)[setDT(new.df), (cols) := mget(paste0("i.", cols)), on = c("time", "var1")]