R语言如何将数据集按多列元素全组合拆分为独立小数据集
实现方案
你可以直接用基础R自带的split函数或者tidyverse生态的工具完成按多列组合拆分数据集的需求,两种方案都支持自动生成独立对象,适配多元素列的场景:
方案1:基础R实现(无需安装额外包)
- 首先按
question和year两列的唯一组合拆分数据集:
# 导入示例数据集 championships <- structure(list(id = structure(c(25, 25, 25, 25, 25, 25, 25, 25, 25, 25), format.stata = "%8.0g"), year = structure(c(2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018), format.stata = "%8.0g"), round = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), format.stata = "%8.0g"), question = structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), format.stata = "%8.0g"), correct = structure(c(0, 0, 0, 0, 0, 0, 1, 0, 1, 0), format.stata = "%8.0g")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame")) # 按两列组合拆分,drop=TRUE会自动剔除不存在的空组合 split_list <- split(championships, list(championships$question, championships$year), drop = TRUE)
- 一键将列表中的所有小数据集导出为全局环境的独立对象:
# 可选:自定义对象名格式,比如改成q1_2018、q2_2018的命名规则 names(split_list) <- paste0("q", gsub("\\.", "_y", names(split_list))) # 导出到全局环境 list2env(split_list, envir = .GlobalEnv)
操作完成后直接输入对象名比如q1_y2018就能调取对应组合的数据集。
方案2:tidyverse实现(适配tidy语法习惯)
library(tidyverse) # 分组后嵌套生成拆分后的数据集列表 split_df <- championships %>% group_by(question, year) %>% nest() %>% # 自定义生成独立对象的名称 mutate(obj_name = paste0("q", question, "_y", year)) # 批量导出到全局环境 walk2(split_df$data, split_df$obj_name, ~assign(.y, .x, envir = .GlobalEnv))
实用提示
- 如果需要拆分更多列,只需要在
split的分组列表或者group_by参数中追加对应列名即可,后续逻辑不需要改动,适配任意数量的拆分列 - 可以在导出前过滤无效分组:比如只保留观测数≥3的分组,基础R可以加
split_list <- split_list[sapply(split_list, nrow) >= 3],tidyverse可以在nest()后加filter(nrow(data) >=3) - 如果拆分后的分组数量非常多,不建议生成大量独立对象,直接操作拆分后的列表会更方便管理,需要时取
split_list[["q1_y2018"]]即可
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

