Подсчет по нескольким столбцам, игнорируя NA - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть набор данных, в котором я хочу подсчитать количество раз значение (больше 0) присутствует в диапазоне столбцов, представленных в x_times .

Пример:

.    x1   x2   x3   x4  x_times
1    NA    0    0    0   0
2     0   NA    0    0   0
3     0    0   NA    1   1
4     1    0    1   NA   2
5    NA    0    0    0   0
6     0   NA    0    0   0
7     0    0   NA    0   0
8     1    2    4   NA   3
9    NA    0    0    0   0
10    0   NA    1    5   2
11    0    0   NA    0   0
12    0    1    0   NA   1

Я возился с инструкциями ifelse, но с 4 столбцами это немного излишне.Я мог бы, но должен быть более легкий путь.

count <- 0
with(df5, ifelse(df$x1 > 0, count+1, ifelse(df$x1 == 0 , count+0 ,
    ifelse(df$x2 > 0, count+1, ifelse(df$x2 == 0, count+0,
     ifelse(df$x3 > 0, count+1, ifelse(df$x3 == 0, count+0, 
       ifelse(df$x4 > 0, count+1, ifelse(df$x4 == 0, count+0, 0 
 )))))))))

Дополнительный вопрос, могу ли я сделать +1 в ifelse заявлениях, подобных этому?Эти строки кода ifelse не работают, он изменяет значения, а не добавляет их.

Я попытался поработать с этим: apply(cbind(df$x1, df$x2, df$x3,df$x4), 1, function(x) ifelse(all(is.na(x)), NA, nrow(x, na.rm=T))), но безрезультатно.

dplyr::count() возвращает ошибкио целых числах

rowSums складывает значения, я просто хочу +1, когда x > 0.

Я чувствую, что это простой вопрос, но я не могу понять этов сжатой форме.Ответы с циклом приветствуются для больших наборов данных, но это не обязательно должна быть функция / цикл как таковая.

1 Ответ

0 голосов
/ 21 ноября 2018

Как говорит @Sotos в комментариях, вы можете просто использовать rowSums.

 dat <- 
   data.frame(x1 = c(rep(c(NA, 0, 0, 1), 2), NA, 0, 0, 0),
              x2 = c(0, NA, 0, 0, 0, NA, 0, 2, 0, NA, 0, 1),
              x3 = c(0, 0, NA, 1, 0, 0, NA, 4, 0, 1, NA, 0),
              x4 = c(0, 0, 1, NA, 0, 0, 0, NA, 0, 5, 0, NA))

library(tidyverse)
> dat %>% mutate(x_times = rowSums(.>0, na.rm = TRUE))

   x1 x2 x3 x4 x_times
1  NA  0  0  0       0
2   0 NA  0  0       0
3   0  0 NA  1       1
4   1  0  1 NA       2
5  NA  0  0  0       0
6   0 NA  0  0       0
7   0  0 NA  0       0
8   1  2  4 NA       3
9  NA  0  0  0       0
10  0 NA  1  5       2
11  0  0 NA  0       0
12  0  1  0 NA       1
...