2012-03-06 80 views
3

我中的R这样数据合并副本: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  4 6  NA 

VAR1和Var1.1表示相同的变量,所以每个主题有一列为NA,另一列为数值(没有人有两个NA或两个数字)。我想合并列以获得单个Var1:(3,8,5,6)。

如何做到这一点的任何提示?

回答

2

您可以使用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]; 
+0

优雅的解决方案!谢谢。 (尽管如此,我不得不在最后一行使用方括号,以防止R尝试调用var.merged和var1.copy作为函数。) – 2012-03-06 03:07:35

+0

感谢您的接触,我在R和MATLAB之间切换,我的大脑得到了有时困惑。 – Cramer 2012-03-06 06:15:49

2

这取决于你想怎样,如果有冲突合并。

您可以简单地将全部var.1.1中的非NA值放入var1的相应位置。如果发生冲突,这将有利于var.1.1

var1[!is.na(var1.copy)] <- var1.copy[!is.na(var1.copy)] 

你可以只填写所有NA值与var1var1.1相应的值。如果发生冲突,这将有利于var1

var1[is.na(var1)] <- var1.copy[is.na(var1)] 
3

如果你只处理两列,并有从未两个数字或两台NAS,就可以计算出该行的意思,而忽略遗漏值:

fake$fixed <- rowMeans(fake[, c("var1", "var1.1")], na.rm=TRUE)