如果所有汇总值都是NA,则dplyr汇总保留NA

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果所有汇总值都是NA,则dplyr汇总保留NA相关的知识,希望对你有一定的参考价值。

我想使用dplyr summary来按组计算总数。具体来说,如果并非所有求和值都是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作为输出。

答案

我们可以有一个if/else条件 - if all'数字是NA的值,然后返回NAelse得到sum

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

我正在努力做同样的事情,所以我写了一个解决方案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_,如果all都是NA则返回NA,否则删除NA和计算总和无缺失值。

以上是关于如果所有汇总值都是NA,则dplyr汇总保留NA的主要内容,如果未能解决你的问题,请参考以下文章

仅当每月少于 10 天是 NA 时,如何使用 dplyr 和 lubridate 每月汇总每日数据?

如果焦点变量是NA,则在R中创建具有“替换”变量值的汇总变量

使用dplyr将R中的所有NA值替换为0

R语言dplyr包将dataframe中的NA值替换(replace)为0实战:所有NA值替换(replace)为0具体列的NA值替换(replace)为0若干列的NA值替换(replace)为0

R:dplyr条件汇总并按列重新编码值

动态选择列和汇总数据[重复]