2012-03-23 4 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

ответ

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

отлично, это делает все, что нужно! –

2

Другой способ заключается в вычесть вектор цели из каждой строки вашего data.frame, свести на нет, а затем сделать rowSums с 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

спасибо, что показал мне еще один способ :) –