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

在R中基于2012年季度均值生成全列新字段的dplyr实现问题

R处理季度数据集:计算2012年均值并填充全列

需求说明

处理季度频率数据集,提取2012年四个季度的durabl和services列均值,将该均值新增为base_durabl和base_services列并填充所有行。

原始数据集

date durabl services 
2011-10-01 56.7 37.1
2012-01-01 68.1 90.6
2012-04-01 34.1 29.1
2012-07-01 22.56 34.12
2012-10-01 44.89 66.8

期望结果

date durabl services base_durabl base_services
2011-10-01 56.7 37.1 42.4125 55.155
2012-01-01 68.1 90.6 42.4125 55.155
2012-04-01 34.1 29.1 42.4125 55.155
2012-07-01 22.56 34.12 42.4125 55.155
2012-10-01 44.89 66.8 42.4125 55.155

问题分析

你之前的代码用group_by(year(date))后加filter,会过滤掉非2012年的数据,且分组后计算的均值仅在分组内有效,无法覆盖全表;用summarise会聚合数据,丢失原始行信息,因此达不到目标。

正确实现方法

方法1:先计算均值再合并到原表

先单独计算2012年两列的均值,再将这两个值作为新列添加到原数据集:

library(dplyr)
library(lubridate)

# 计算2012年的均值
mean_vals <- df %>%
  filter(year(date) == 2012) %>%
  summarise(base_durabl = mean(durabl),
            base_services = mean(services))

# 将均值列添加到原数据集
df_new <- df %>%
  bind_cols(mean_vals)

方法2:用mutate结合条件计算(无需额外对象)

直接在原数据集上新增列,通过条件筛选2012年的数据计算均值,由于均值是标量,会自动填充所有行:

df_new <- df %>%
  mutate(base_durabl = mean(durabl[year(date) == 2012], na.rm = TRUE),
         base_services = mean(services[year(date) == 2012], na.rm = TRUE))

注:加上na.rm=TRUE可避免2012年数据有缺失值时计算出错,可根据实际情况选择是否保留。

验证结果

运行上述代码后,得到的df_new会与期望结果一致,所有行的base_durabl和base_services均填充了2012年的均值。

内容的提问来源于stack exchange,提问作者Fef894

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:35:20