2012-03-23 44 views
5

假數據:R:我怎樣才能跨越變量總結,案件範圍內,而計數NA作爲例證零個

df <- data.frame(a=c(1,2,3,4,5), b=(c(2,2,2,2,NA)), 
       c=c(NA,2,3,4,5))) 

這讓我想如果不是爲NA值的答案:

df$count <- with(df, (a==1) + (b==2) + (c==3)) 

另外,如果我只對我感興趣,會不會有更優雅的方式,例如變量== 2?

df$count <- with(df, (a==2) + (b==2) + (c==2)) 

非常感謝!

+0

+1的一個很好的問題,一個偉大的用戶名:) – Tommy 2012-03-23 21:35:40

回答

5

您的具體示例下面的作品,但我有一個懷疑,你的真實使用情況是比較複雜:

df$count <- apply(df,1,function(x){sum(x == 1:3,na.rm = TRUE)}) 
> df 
    a b c count 
1 1 2 NA  2 
2 2 2 2  1 
3 3 2 3  2 
4 4 2 4  1 
5 5 NA 5  0 

但這種通用的方法應該工作。例如,你的第二個例子是這樣的:

df$count <- apply(df,1,function(x){sum(x == 2,na.rm = TRUE)}) 

或者更一般地,你可以讓自己在一個變量傳遞的比較:

df$count <- apply(df,1,function(x,compare){sum(x == compare,na.rm = TRUE)},compare = 1:3) 
+0

很棒,這就是我需要的一切! – 2012-03-23 21:37:46

2

另一種方法是減去你的目標向量從data.frame的每一行,否定,然後做rowSumsna.rm=TRUE

target <- 1:3 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 2 1 2 1 0 

target <- rep(2,3) 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 1 3 1 1 0 
+0

感謝您向我展示另一種方式:) – 2012-03-23 23:30:31

相關問題