You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:23:12