R语言dplyr包:按实体分组筛选非空值后求对应列均值的结果异常问题
问题排查与代码修正
首先来看你的代码里的几个关键问题:
1. 字符串型"NA"未转换为真实NA值
你的数据中PROD_OIL列的"NA"是字符串类型,不是R原生的缺失值NA,所以is.na(PROD_OIL)根本识别不出这些缺失值,直接导致筛选逻辑完全失效。
2. 错误引用原始数据框而非分组数据流
在summarise里你用了with(dt, ...),这里的dt是原始的未分组、未排序的数据框,完全忽略了之前的arrange和group_by操作,相当于直接从原始数据里取数,自然得不到正确的分组计算结果。
修正后的代码
library(dplyr) # 第一步:清洗数据,把字符串"NA"转成真实NA,同时将PROD_OIL转为数值型 dt_cleaned <- dt %>% mutate(PROD_OIL = as.numeric(ifelse(PROD_OIL == "NA", NA, PROD_OIL))) # 第二步:执行分组计算逻辑 AvgLast3WT <- dt_cleaned %>% arrange(entity, desc(REPORT_DATE)) %>% group_by(entity) %>% # 筛选每组内PROD_OIL非NA的行,取前3个对应的FORECAST_PROD_OIL值计算均值 summarise(GetMean = mean(FORECAST_PROD_OIL[!is.na(PROD_OIL)][1:3], na.rm = TRUE)) %>% ungroup() # 查看结果 AvgLast3WT
代码解释
- 数据清洗:先处理
PROD_OIL列的字符串"NA",替换为R原生缺失值并转成数值型,确保后续的缺失值判断正常工作。 - 排序与分组:按
entity分组后,每组内按REPORT_DATE降序排列,保证最新的记录排在前面。 - 均值计算:在每组内先筛选出
PROD_OIL非缺失的行,取前3个对应的FORECAST_PROD_OIL值,最后计算均值(na.rm = TRUE是兜底逻辑,避免极端情况下的NA影响结果)。
运行这段代码后,得到的GetMean值约为286.07,和你的预期结果完全一致。
内容的提问来源于stack exchange,提问作者CodeMaster
相关产品推荐
相关产品推荐

