在R中同时使用group by与条件均值的实现及错误排查
解决条件均值计算的dplyr代码错误问题
问题背景
数据集包含以下列:Ticker、Company_name、Forecast_period、Measure、Estimate、Forecast_date。其中Measure取值为EPS或DPS,Forecast_period取值为1或2。需要计算三个条件均值:
- EPS1均值:
Measure=EPS且Forecast_period=1时Estimate的均值 - EPS2均值:
Measure=EPS且Forecast_period=2时Estimate的均值 - DPS1均值:
Measure=DPS且Forecast_period=1时Estimate的均值
用户编写的错误代码:
IBESdatamean2 <- IBESdata %>% group_by(Company_name, Ticker, Forecast_period) %>% summarize(mean[Measure == "EPS" & Forecast_period == 1, 'Estimate'])
报错信息:
Caused by error in `mean[Measure == "EPS" & Forecast_period == 1, "Estimate"]`: ! object of type 'closure' is not subsettable
错误原因
- 误用
mean函数:mean是R的内置函数(属于closure类型),不能用[ ]进行子集索引,正确用法是将需要计算均值的向量作为参数传入mean()。 - 分组逻辑冲突:分组时包含了
Forecast_period,但又在summarize中硬编码筛选Forecast_period=1,导致分组后每个组的Forecast_period为固定值,筛选逻辑失去意义。
正确实现方案
方案1:直接分组计算多条件均值
仅按Company_name和Ticker分组,在summarize中分别对三个条件计算Estimate的均值,同时处理缺失值:
IBESdatamean2 <- IBESdata %>% group_by(Company_name, Ticker) %>% summarize( EPS1_mean = mean(Estimate[Measure == "EPS" & Forecast_period == 1], na.rm = TRUE), EPS2_mean = mean(Estimate[Measure == "EPS" & Forecast_period == 2], na.rm = TRUE), DPS1_mean = mean(Estimate[Measure == "DPS" & Forecast_period == 1], na.rm = TRUE), .groups = "drop" # 取消分组,返回普通数据框 )
方案2:筛选后转宽表(扩展性更强)
先过滤出目标行,合并Measure和Forecast_period为统一指标列,计算均值后转成宽表格式:
IBESdatamean2 <- IBESdata %>% # 筛选出需要计算的三种情况 filter((Measure == "EPS" & Forecast_period %in% c(1,2)) | (Measure == "DPS" & Forecast_period == 1)) %>% # 生成指标名称(如EPS1、EPS2、DPS1) mutate(metric = paste0(Measure, Forecast_period)) %>% group_by(Company_name, Ticker, metric) %>% summarize(mean_estimate = mean(Estimate, na.rm = TRUE), .groups = "drop") %>% # 转成宽表,每个指标对应一列均值 pivot_wider(names_from = metric, values_from = mean_estimate, names_prefix = "mean_")
两种方案对比:
- 方案1逻辑直观,直接生成所需的三个均值列,适合固定需求。
- 方案2扩展性更强,后续新增指标(如DPS2)只需调整
filter条件即可。
内容的提问来源于stack exchange,提问作者oreka97
相关产品推荐
相关产品推荐

