2012-03-06 78 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)