在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
相关产品推荐
相关产品推荐

