dplyr суммируют, сохраняют NA, если все суммированные значения являются NA - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу использовать суммирование dplyr для суммирования подсчетов по группам.В частности, я хочу удалить значения NA, если не все суммированные значения являются NA, но если все значения суммированы как NA, я хочу отобразить NA.Например:

name <- c("jack", "jack", "mary", "mary", "ellen", "ellen")
number <- c(1,2,1,NA,NA,NA)

df <- data.frame(name,number)

В этом случае я хочу следующий результат:

  • Джек = 3
  • Мэри = 1
  • Эллен =NA

Однако, если я установлю na.rm = F:

df %>% group_by(name) %>% summarise(number = sum(number, na.rm = F))

Результат будет:

  • Джек = 3
  • Мэри= NA
  • Эллен = NA

И если я установлю na.rm = T:

df %>% group_by(name) %>% summarise(number = sum(number, na.rm = T))

В результате получится

  • Джек= 3
  • Мэри = 1
  • Эллен = 0

Как я могу решить эту проблему, чтобы случаи с числами и NA получали число в качестве вывода, нослучаи с только NA получают NA в качестве вывода.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я боролся с тем же, поэтому я написал решение в пакет hablar.Попробуйте:

library(hablar)

df %>% group_by(name) %>% 
  summarise(number = sum_(number))

, что дает вам:

# A tibble: 3 x 2
  name  number
  <fct>  <dbl>
1 ellen    NA 
2 jack      3.
3 mary      1.

не то, чтобы единственная разница в синтаксисе была sum_, которая представляет собой функцию, которая возвращает NA, если все равно NA, иначе удаляет NA ивычисляет сумму не пропущенных значений.

0 голосов
/ 21 февраля 2019

У нас может быть условие if/else - if all значения в 'числах NA, затем возвращаем NA или else получаем sum

library(dplyr)
df %>% 
  group_by(name) %>% 
  summarise(number = if(all(is.na(number))) NA_real_ else sum(number, na.rm = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...