You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:15:03