R语言如何将data.frame拆分为含唯一group组对的小data.frame列表
R 按列唯一组合拆分数据框为子数据集列表的实现方案
问题描述
我需要将示例data拆分,得到由更小的data.frame组成的列表,每个子data.frame对应指定列的唯一组合。希望得到通用的函数式解决方案,可适配列名、列数与示例不同的任意数据集。
示例数据
m= " y group time outcome 7 a 1 A 3 a 0 B 6 a 1 B 5 b 0 A 9 b 1 A 4 b 0 B" data <- read.table(text = m, h=T)
预期输出
desired_output <- list( data.frame(y = 5 , group = "b" , time = 0 , outcome = "A" ), data.frame(y = c(7,9), group = c("a","b"), time = c(1,1), outcome = c("A","A")), data.frame(y = c(3,4), group = c("a","b"), time = c(0,0), outcome = c("B","B")), data.frame(y = 6 , group = "a" , time = 1 , outcome = "B"))
注:原示例预期输出中第三条的outcome字段存在笔误,已根据原始数据修正为B
解决方案
方法1:Base R 无依赖实现
用原生split()函数即可实现,可灵活指定分组列,适配所有数据框场景:
# 通用函数:df为输入数据框,group_cols为用于拆分的分组列名向量 split_to_group_list <- function(df, group_cols) { # 按指定列的唯一组合拆分,去除空分组,移除列表默认命名 res <- split(df, f = df[, group_cols], drop = TRUE) unname(res) } # 示例调用:按time、outcome两列的唯一组合拆分 output <- split_to_group_list(data, group_cols = c("time", "outcome"))
方法2:tidyverse 生态实现
如果习惯使用dplyr语法,可以用group_split()函数,逻辑更直观:
library(dplyr) # 示例调用,直接在group_by中指定分组列即可 output <- data %>% group_by(time, outcome) %>% group_split() %>% unname()
两种方案输出结果完全匹配需求,如需调整分组逻辑仅需要修改分组列参数即可,无需改动核心代码。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

