如何用group_by()为时间区间生成均值列并添加至数据集
按指定5年区间计算均值并添加为新列(使用dplyr的group_by)
要实现按每5年区间计算均值并填充到对应行的需求,我们可以借助dplyr包的group_by()和mutate()函数完成,具体步骤如下:
完整实现代码
# 加载dplyr包 library(dplyr) # 原始数据集 anos <- 1988:2020 valores <- c(15, 18, 20, NA, 25, 27, 28, NA, 32, 35, 36, 38, 40, 42, 45, 46, NA, 50, 52, 55, 56, 58, 60, NA, 65, 66, 68, 70, 72, 75, 76, 78, 80) dataset <- data.frame(Ano = anos, Valor = valores) # 生成分组标识并计算区间均值 dataset <- dataset %>% # 按每5年一组生成分组ID,最后不足5年的自动归为最后一组 mutate(grupo = floor((Ano - min(Ano)) / 5)) %>% # 按分组ID分组 group_by(grupo) %>% # 计算每组均值(忽略NA值),并添加为新列Medias mutate(Medias = mean(Valor, na.rm = TRUE)) %>% # 取消分组(可选,后续操作不需要分组时建议取消) ungroup() %>% # 移除临时的grupo列(可选,根据需求保留或删除) select(-grupo) # 查看结果 print(dataset)
关键逻辑说明
- 分组标识生成:
floor((Ano - min(Ano)) / 5)以起始年份(1988)为基准,将年份转换为分组编号。例如:- 1988-1992年:
(1988-1988)/5=0,(1992-1988)/5=0.8,floor后均为0,属于同一组 - 最后一组2018-2020年:
(2020-1988)/5=6.4,floor后为6,单独成组
- 1988-1992年:
- 均值计算:
mean(Valor, na.rm = TRUE)自动忽略数据中的NA值,确保均值计算准确 - 填充逻辑:
mutate()会将每组的均值重复填充到该组的所有行中,完全符合需求
结果验证
运行代码后生成的Medias列与你提供的期望结果完全一致:
- 1988-1992年均值为19.5
- 1993-1997年均值为30.5
- ...
- 2018-2020年均值为78
内容的提问来源于stack exchange,提问作者Pedro Cardoso
相关产品推荐
相关产品推荐

