dplyr summarise函数未返回预期结果,seq=2行字段全为NA求解答
R语言分组聚合后NA问题分析及解决
原始代码
d <- data.frame(seq=c(0,0,1,1,2,2,2), kdt=c('2023-01-30','2023-01-30','2023-04-04','2023-04-04','2023-06-01', '2023-06-04','2023- 06-04'), ldt=c('2023-01-30','2023-01-30','2023-04-04','2023-04-04','2023-06-01',NA,NA), l=c(11,15,22,17,NA,34,22), r=c('A','A','B','B','C',NA,NA)) ds <- d %>% group_by(seq) %>% summarise(mkdt=max(kdt),mldt=max(ldt),sl=sum(l),mr=max(r))
问题原因
seq=2分组返回全NA的核心原因是R语言基础聚合函数默认不忽略NA值:
sum(l):seq=2的l列包含NA,默认sum遇到NA直接返回NA,不会自动跳过NA计算有效数值的和max(ldt)和max(r):这两列在seq=2分组里都存在NA,默认max函数只要遇到NA就返回NA,不会取非NA值的最大值- 额外注意:
kdt列里的'2023- 06-04'包含多余空格,会导致日期字符串排序异常,建议提前清理
修正后的代码
library(dplyr) library(stringr) d <- data.frame(seq=c(0,0,1,1,2,2,2), kdt=c('2023-01-30','2023-01-30','2023-04-04','2023-04-04','2023-06-01', '2023-06-04','2023- 06-04'), ldt=c('2023-01-30','2023-01-30','2023-04-04','2023-04-04','2023-06-01',NA,NA), l=c(11,15,22,17,NA,34,22), r=c('A','A','B','B','C',NA,NA)) %>% # 清理kdt列的多余空格 mutate(kdt = str_trim(kdt)) ds <- d %>% group_by(seq) %>% summarise( mkdt=max(kdt, na.rm=TRUE), mldt=max(ldt, na.rm=TRUE), sl=sum(l, na.rm=TRUE), mr=max(r, na.rm=TRUE) )
修正后结果
seq=2分组会得到预期值:
- mldt:
'2023-06-01' - mr:
'C' - sl:
56
内容的提问来源于stack exchange,提问作者Ya Huang
相关产品推荐
相关产品推荐

