dplyr summarise保留NA,如果所有汇总值都为NA

6
我希望使用dplyr summarise按组汇总计数。具体来说,如果不是所有的汇总值都为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)

在这种情况下,我希望得到以下结果:
  • Jack = 3
  • Mary = 1
  • Ellen = NA
但是,如果我设置 na.rm = F
df %>% group_by(name) %>% summarise(number = sum(number, na.rm = F))

结果如下:
  • Jack = 3
  • Mary = NA
  • Ellen = NA

如果我设置 na.rm = T

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

结果是:
  • Jack = 3
  • Mary = 1
  • Ellen = 0
如何解决这个问题,使得带有数字和NA的情况能够获得数字作为输出,但只有NA的情况则获得NA作为输出。
2个回答

6

我们可以使用 if/else 条件 - 如果 'number' 中的所有值都是 NA, 则返回 NA, 否则获取 sum

library(dplyr)
df %>% 
  group_by(name) %>% 
  summarise(number = if(all(is.na(number))) NA_real_ else sum(number, na.rm = TRUE))

6

我曾经遇到同样的问题,所以我将一个解决方案写进了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并计算不缺失值的和。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接