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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:33:12