2012-03-23 11 views
5

dữ liệu Fake để minh hoạ:R: Làm thế nào tôi có thể tóm tắt qua các biến, trong trường hợp, trong khi đếm NA như zero

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

Điều này sẽ làm cho tôi câu trả lời tôi muốn NẾU nó không được cho các giá trị NA:

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

Ngoài ra, sẽ có một cách thanh lịch hơn nữa nếu tôi chỉ quan tâm, ví dụ: biến == 2?

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

Rất cám ơn!

+0

+1 cho một câu hỏi hay và một tên người dùng tuyệt vời :) – Tommy

Trả lời

5

Các công trình sau đây ví dụ cụ thể của bạn, nhưng tôi có một nghi ngờ rằng trường hợp sử dụng thực sự của bạn là phức tạp hơn:

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 

nhưng cách tiếp cận chung này nên làm việc. Ví dụ, ví dụ thứ hai của bạn sẽ là một cái gì đó như thế này:

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

hoặc tổng quát hơn bạn có thể cho phép bản thân để vượt qua trong một biến cho việc so sánh:

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

tuyệt vời, điều này làm mọi thứ tôi cần! –

2

Một cách khác là để trừ vector mục tiêu của bạn từ mỗi dãy data.frame của bạn, phủ nhận và sau đó làm rowSums với na.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

cảm ơn vì đã chỉ cho tôi một cách khác :) –