R语言:合并时间序列截面数据的两年行,计算均值并合并年份
R解决方案:将面板数据按连续两年分组计算均值
核心思路
按国家分组后,给每一组连续的奇数年+偶数年创建统一的分组标识,再基于该分组计算均值并拼接年份格式。
代码实现(dplyr版本)
先加载依赖包,再处理数据:
library(dplyr) # 假设你的数据框名为df processed_df <- df %>% # 按国家分组,同时生成每两年一组的标识(确保奇数年在前) group_by(country, group = (year + 1) %/% 2) %>% # 计算均值并拼接年份 summarise( year = paste(min(year), max(year), sep = "_"), `value(mean)` = mean(value), .groups = "drop" ) %>% # 移除临时分组列 select(-group)
代码解释
- 分组逻辑:
(year + 1) %/% 2会把2015和2016映射为同一个数值(1008),2017和2018映射为1009,以此保证每连续两年(奇数年在前)被分到同一组。 - 生成目标格式:用
paste(min(year), max(year), sep = "_")将每组的起止年份拼接为YYYY_YYYY格式。 - 计算均值:直接用
mean(value)得到每组的value平均值。
示例验证
用你提供的示例数据测试:
# 构造示例数据 df <- data.frame( country = c(rep("Belgium",4), rep("Malta",2)), year = c(2015,2016,2017,2018,2015,2016), value = c(3,5,8,10,1,3) ) # 运行处理代码后输出: # country year `value(mean)` # <chr> <chr> <dbl> # 1 Belgium 2015_2016 4 # 2 Belgium 2017_2018 9 # 3 Malta 2015_2016 2
拓展:过滤单年组
如果部分国家存在单独一年的观测(无对应连续年份),可以添加过滤步骤只保留完整的两年组:
processed_df <- df %>% group_by(country, group = (year + 1) %/% 2) %>% filter(n() == 2) # 仅保留包含两年数据的分组 summarise( year = paste(min(year), max(year), sep = "_"), `value(mean)` = mean(value), .groups = "drop" ) %>% select(-group)
高效替代方案(data.table版本)
如果数据量较大,用data.table处理效率更高:
library(data.table) setDT(df) processed_df <- df[, .( year = paste(min(year), max(year), sep = "_"), `value(mean)` = mean(value) ), by = .(country, group = (year + 1) %/% 2)][, group := NULL]
内容的提问来源于stack exchange,提问作者ghost_trevor
相关产品推荐
相关产品推荐

