R语言基于列表内数据框的列生成按年份分类的新数据框列表
实现方法
你可以根据使用习惯选择以下两种方案,都能得到符合要求的按年份拆分的数据框列表:
方案1:tidyverse 实现(代码简洁易维护)
先给原列表元素命名为type1/type2,通过长宽表转换重组数据,最后按年份拆分:
library(tidyverse) names(list_types) <- paste0("type", seq_along(list_types)) year_list <- list_types %>% bind_rows(.id = "type") %>% pivot_longer(cols = starts_with("year_"), names_to = "year", values_to = "value", names_prefix = "year_") %>% pivot_wider(id_cols = c(unit_name, year), names_from = type, values_from = value) %>% group_split(year) %>% setNames(paste0("df_", map_chr(., ~unique(.x$year))))
运行后year_list对象中即包含df_2014/df_2015/df_2016三个数据框,结构与示例完全匹配。如果需要把三个数据框单独释放到全局环境,追加运行list2env(year_list, .GlobalEnv)即可。
方案2:Base R 实现(无第三方包依赖)
不需要安装额外扩展包,直接按年份列循环提取拼接即可:
year_cols <- grep("^year_", names(list_types[[1]]), value = TRUE) names(list_types) <- paste0("type", seq_along(list_types)) year_list <- lapply(year_cols, function(yr){ res_df <- data.frame(unit_name = list_types[[1]]$unit_name) for(tp in names(list_types)){ res_df[[tp]] <- list_types[[tp]][[yr]] } res_df }) names(year_list) <- sub("year_", "df_", year_cols)
注意:以上代码默认列表中所有数据框的
unit_name顺序完全一致,如果不同数据框内单元顺序存在差异,需要先按unit_name做排序匹配合并,避免数值和单元对应错位。
内容的提问来源于stack exchange,提问作者Diego Brizuela
相关产品推荐
相关产品推荐

