R: Как я могу суммировать по переменным внутри случаев, считая NA как ноль - PullRequest
5 голосов
/ 24 марта 2012

Поддельные данные для иллюстрации:

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)) 

Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

Следующее работает для вашего конкретного примера, но у меня есть подозрение, что ваш реальный вариант использования более сложный:

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)
2 голосов
/ 24 марта 2012

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