如何按组大小拆分分组DataFrame?有无tidyverse实现方法?
按组大小拆分DataFrame的tidyverse实现方案
问题背景
你已经掌握了这些dplyr操作:
original_df %>% group_by(grouping_factor) %>% group_split():按指定分组因子将数据拆分为DataFrame列表original_df %>% group_by(grouping_factor) %>% summarize(counts = n()):统计每个分组的行数(组大小)original_df %>% group_by(grouping_factor) %>% filter(n() == <size #>):筛选出指定大小的分组
现在需要实现:按组的大小拆分数据——把所有行数相同的分组合并到同一个DataFrame中,比如所有大小为2的组放一起,大小为3的组放一起,同时想确认group_split()是否支持自定义拆分逻辑。
tidyverse实现方法
不需要循环,通过两步即可完成:先给每个行标记所属分组的大小,再按这个大小分组拆分。
方法一:一步链式操作
# 直接生成按组大小拆分的DataFrame列表 split_by_size <- original_df %>% # 先按原分组因子分组,给每行标记组大小 group_by(grouping_factor) %>% mutate(group_size = n()) %>% ungroup() %>% # 按组大小重新分组,然后拆分 group_by(group_size) %>% group_split(.keep = FALSE) # .keep=FALSE 会移除group_size列,按需选择是否保留
方法二:先做分组大小映射(更清晰)
如果需要单独保留分组大小的映射关系,可以先生成映射表再关联:
# 第一步:生成每个分组对应的大小映射 group_size_map <- original_df %>% group_by(grouping_factor) %>% summarize(group_size = n()) # 第二步:关联映射表,按组大小拆分 split_by_size <- original_df %>% left_join(group_size_map, by = "grouping_factor") %>% group_by(group_size) %>% group_split(.keep = FALSE)
给列表命名(可选)
如果需要给拆分后的列表元素加上明确的名称(比如size_2、size_3),可以用purrr的set_names:
library(purrr) # 先提取所有唯一的组大小,再给列表命名 unique_sizes <- sort(unique(group_size_map$group_size)) split_by_size <- split_by_size %>% set_names(paste0("size_", unique_sizes))
关于group_split()的自定义拆分问题
group_split()本身不支持直接自定义拆分逻辑——它只能基于你group_by()指定的分组键来拆分数据。如果要实现非默认的拆分(比如按组大小),必须先把拆分依据(这里是组大小)转换成一个可分组的变量,再用group_by()指定这个变量后调用group_split(),这也是上面方案的核心思路。
内容的提问来源于stack exchange,提问作者Sudoh
相关产品推荐
相关产品推荐

