R:合并同一变量的副本
我在R中有这样的数据:R:合并同一变量的副本,r,merge,R,Merge,我在R中有这样的数据: subjID = c(1,2,3,4) var1 = c(3,8,NA,6) var1.copy = c(NA,NA,5,NA) fake = data.frame(subjID = subjID, var1 = var1, var1 = var1.copy) 看起来是这样的: > fake subjID var1 var1.1 1 1 3 NA 2 2 8 NA 3 3 NA 5 4
subjID = c(1,2,3,4)
var1 = c(3,8,NA,6)
var1.copy = c(NA,NA,5,NA)
fake = data.frame(subjID = subjID, var1 = var1, var1 = var1.copy)
看起来是这样的:
> fake
subjID var1 var1.1
1 1 3 NA
2 2 8 NA
3 3 NA 5
4 4 6 NA
Var1和Var1.1表示相同的变量,因此每个主题的一列为NA,另一列为数值(没有人有两个NAs或两个数字)。我想合并这些列,得到一个Var1:(3,8,5,6)
有关如何执行此操作的任何提示?您可以使用is.na,它可以矢量化为:
# get all the ones we can from var1
var.merged = var1;
# which ones are available in var1.copy but not in var1?
ind = is.na(var1) & !is.na(var1.copy);
# use those to fill in the blanks
var.merged[ind] = var1.copy[ind];
这取决于存在冲突时要合并的方式 您可以简单地将
var.1.1
中的所有非NA值放入var1
的相应插槽中。如果发生冲突,这将有利于var.1.1
var1[!is.na(var1.copy)] <- var1.copy[!is.na(var1.copy)]
如果您只处理两列,并且从来没有两个数字或两个NAs,则可以计算行平均值并忽略缺少的值:
fake$fixed <- rowMeans(fake[, c("var1", "var1.1")], na.rm=TRUE)
假的$fixed优雅解决方案!非常感谢。(不过,我不得不在最后一行中使用方括号,以防止R试图将var.merged和var1.copy作为函数调用。)多亏了这个陷阱,我在R和MATLAB之间切换,有时我的大脑会感到困惑。
fake$fixed <- rowMeans(fake[, c("var1", "var1.1")], na.rm=TRUE)