在R语言中如何基于日期值创建年初至今的Workout平均值列
解决方法:计算年初至今的Workout累积平均值
嘿,我来帮你搞定这个需求!要给数据框添加Average_Workout列,存储每个时间点从年初到当前的Workout平均值,我们可以分步骤来操作:
关键点说明
首先要注意两个重要细节:
- 你的
Date列是字符串格式,得先转换成R能识别的日期类型 Workout列也是字符串,计算前要转为数值型
方法一:用dplyr包(简洁直观)
dplyr是处理数据框非常方便的工具,步骤如下:
- 先加载dplyr包(如果没安装的话先运行
install.packages("dplyr")) - 转换日期格式、按日期排序、按年份分组,最后计算累积平均
library(dplyr) # 原始数据框 df <- data.frame(id = c('1', '2', '3', '4', '5', '6'), Date = c("01-Feb-17", "05-Feb-17", "03-May-17","24-May-17","20-Oct-17", "25-Oct-17"), Name=c("John", "Jack", "Jack", "John", "John", "Jack"), Workout=c('150', '130', '140', '160', '150', '130')) # 处理数据并添加新列 df <- df %>% # 把字符串日期转成日期类型,format参数对应你的日期格式:日-月份缩写-两位年份 mutate(Date = as.Date(Date, format = "%d-%b-%y")) %>% # 按日期排序,确保累积计算是按时间顺序进行的 arrange(Date) %>% # 按年份分组,这样只计算当年内的累积平均,不会跨年份 group_by(year(Date)) %>% # 计算累积平均:累积求和除以当前组内的行数 mutate(Average_Workout = cumsum(as.numeric(Workout)) / row_number()) %>% # 取消分组,回到普通数据框 ungroup()
方法二:用Base R(无需额外包)
如果你不想安装新包,用Base R也能实现:
# 原始数据框 df <- data.frame(id = c('1', '2', '3', '4', '5', '6'), Date = c("01-Feb-17", "05-Feb-17", "03-May-17","24-May-17","20-Oct-17", "25-Oct-17"), Name=c("John", "Jack", "Jack", "John", "John", "Jack"), Workout=c('150', '130', '140', '160', '150', '130')) # 转换日期格式 df$Date <- as.Date(df$Date, format = "%d-%b-%y") # 按日期排序 df <- df[order(df$Date), ] # 提取年份,用于分组计算 df$Year <- format(df$Date, "%Y") # 按年份计算累积平均:ave函数按Year分组,对每个组应用累积求和除以行数的函数 df$Average_Workout <- ave(as.numeric(df$Workout), df$Year, FUN = function(x) cumsum(x)/seq_along(x)) # 不需要Year列的话可以删掉 df$Year <- NULL
最终结果
运行上述代码后,你的数据框会变成这样:
id Date Name Workout Average_Workout 1 1 2017-02-01 John 150 150.0000 2 2 2017-02-05 Jack 130 140.0000 3 3 2017-05-03 Jack 140 140.0000 4 4 2017-05-24 John 160 145.0000 5 5 2017-10-20 John 150 148.0000 6 6 2017-10-25 Jack 130 145.0000
每一行的Average_Workout就是从2017年初到当前日期所有Workout的平均值啦!
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

