2013-05-13 89 views
1

我試圖瓦解行的數據幀,看起來像這樣的a,b和c:崩潰行W/NA值

>df1 = data.frame(a=c(1,1,0,NA,NA,NA,NA,NA,NA),b=c(NA,NA,NA,0,1,1,NA,NA,NA),c=c(NA,NA,NA,NA,NA,NA,1,0,1)) 
    a b c 
1 1 NA NA 
2 1 NA NA 
3 0 NA NA 
4 NA 0 NA 
5 NA 1 NA 
6 NA 1 NA 
7 NA NA 1 
8 NA NA 0 
9 NA NA 1 

到d排,創建一個數據幀,看起來像這樣:

a b c d 
1 1 NA NA 1 
2 1 NA NA 1 
3 0 NA NA 0 
4 NA 0 NA 0 
5 NA 1 NA 1 
6 NA 1 NA 1 
7 NA NA 1 1 
8 NA NA 0 0 
9 NA NA 1 1 

任何和所有的幫助將不勝感激。

回答

4
# using data.frame 
df1$d <- apply(df1, 1, sum, na.rm=TRUE) 

# using data.table 
DT <- data.table(df1) 
DT[, d := sum(.SD, na.rm=TRUE), by=1:nrow(DT)] 
+0

我沒有意識到'by'可能會排成行。很酷的東西! – Frank 2013-05-13 23:16:59

4

這個怎麼樣...

df1$d <- apply(df1 , 1 , max , na.rm=TRUE) 
df1$d 
# [1] 1 1 0 0 1 1 1 0 1 

顯然,這假設你有一張1或各行中的0。如果您同時它總是選擇1

這也將工作給您發佈的數據:

df1[!is.na(df1)] 
# [1] 1 1 0 0 1 1 1 0 1 
+0

(+1)爲第二個答案。這應該是標記答案恕我直言。使用'apply'和'rowSums'將它強制轉換爲這裏沒有必要的矩陣。 – Arun 2013-05-13 23:17:21

+0

爲第二個+1!我同意@Arun,這應該是標記的。 – 2013-05-13 23:40:56

+0

謝謝。我猜測它的有用性取決於樣本數據是否是真實的全部數據反映(即如果*總是*只有1個值)。 – 2013-05-13 23:45:02

2

另一個R基本解決方案是使用rowSums

> transform(df1, d=rowSums(df1, na.rm=TRUE)) 
    a b c d 
1 1 NA NA 1 
2 1 NA NA 1 
3 0 NA NA 0 
4 NA 0 NA 0 
5 NA 1 NA 1 
6 NA 1 NA 1 
7 NA NA 1 1 
8 NA NA 0 0 
9 NA NA 1 1 

或直接df1$d <- rowSums(df1, na.rm=TRUE)