如何用更简洁的R代码按年份分组列表中的数据集
按年份分组合并R列表中的数据集
我有一个包含多个分散数据集的R列表mydatalist,每个数据集都带有year字段,需要按相同年份对这些数据集进行分组合并。
示例数据
mydata12 <- data.frame(Age=c(12,13),Sex=c("F","H"), Weight=c(70,75),year=c(2012)) mydata13 <- data.frame(Age=c(14,15),Sex=c("F","H"), Weight=c(70,75),year=c(2013)) mydata14 <- data.frame(Age=c(16,17),Sex=c("F","H"), Weight=c(70,75),year=c(2014)) mydata2012 <- data.frame(Age=c(18,19),Sex=c("F","H"), Weight=c(70,75),year=c(2012)) mydata2013 <- data.frame(Age=c(20,13),Sex=c("H","H"), Weight=c(70,75),year=c(2013)) mydata2014 <- data.frame(Age=c(22,13),Sex=c("F","F"), Weight=c(70,75),year=c(2014)) mydatalist <- list( `12`=mydata12, `13`=mydata13, `14`=mydata14, `2013`=mydata2012, `2014`=mydata2013, `2015`=mydata2014 )
现有手动实现方式
list(`2012`=rbind(mydatalist$`12`,mydata2012), `2013`=rbind(mydatalist$`13`,mydata2013), `2014`=rbind(mydatalist$`14`,mydata2014))
需求
希望利用2012:2021、12:21这类年份模式编写更简洁的代码,避免为每个年份单独编写一行代码。
解决方案
方法一:Base R 实现
无需额外安装包,先合并所有数据集,再按year字段拆分:
# 合并列表内所有数据集为一个大的数据框 combined_data <- do.call(rbind, mydatalist) # 按year字段拆分,自动生成按年份命名的分组列表 grouped_list <- split(combined_data, combined_data$year)
如果需要筛选特定年份范围(比如2012到2021年),可以添加以下步骤:
target_years <- 2012:2021 # 只保留目标年份的分组 grouped_list_filtered <- grouped_list[names(grouped_list) %in% as.character(target_years)]
方法二:Tidyverse 实现
使用dplyr和purrr包的组合代码,更简洁直观:
library(tidyverse) grouped_list <- mydatalist %>% bind_rows() %>% # 合并所有数据集 group_split(year) %>% # 按year字段拆分列表 set_names(.$year) # 为列表元素设置对应年份的名称
同样,筛选特定年份范围的代码如下:
target_years <- 2012:2021 grouped_list_filtered <- grouped_list[names(grouped_list) %in% as.character(target_years)]
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

