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

如何用R的dplyr将分组data.frame转为保留分组列的列表

解决方案:分组后保留tissue列的列表转换

问题背景

需要将包含tissue和genes列的数据框按tissue分组转为列表,且每个子列表保留tissue列,但使用group_map()时该列丢失。

原始数据

library(tidyverse)
df <- tibble(tissue=c("A","A","B","B"), genes=c('CD79B','CD79A','CD19','CD180'))
df
#> # A tibble: 4 × 2
#>   tissue genes
#>   <chr>  <chr>
#> 1 A      CD79B
#> 2 A      CD79A
#> 3 B      CD19 
#> 4 B      CD180

当前问题代码(丢失tissue列)

df1 <- df |> 
  group_by(tissue) |> 
  group_map(~.)

df1  
#> [[1]]
#> # A tibble: 2 × 1
#>   genes
#>   <chr>
#> 1 CD79B
#> 2 CD79A
#> 
#> [[2]]
#> # A tibble: 2 × 1
#>   genes
#>   <chr>
#> 1 CD19 
#> 2 CD180

方法1:使用group_split()(最简便)

group_split()是专门用于分组拆分数据框为列表的函数,默认会保留分组列,完全符合需求:

df1 <- df |> 
  group_by(tissue) |> 
  group_split()

df1
#> [[1]]
#> # A tibble: 2 × 2
#>   tissue genes
#>   <chr>  <chr>
#> 1 A      CD79B
#> 2 A      CD79A
#> 
#> [[2]]
#> # A tibble: 2 × 2
#>   tissue genes
#>   <chr>  <chr>
#> 1 B      CD19 
#> 2 B      CD180

方法2:修改group_map()的用法(保留原函数)

如果必须使用group_map(),可以通过cur_group()获取当前分组的信息,将分组列合并回子数据框:

df1 <- df |> 
  group_by(tissue) |> 
  group_map(~ bind_cols(cur_group(), .x))

df1

或者手动添加分组列:

df1 <- df |> 
  group_by(tissue) |> 
  group_map(~ .x |> mutate(tissue = cur_group()$tissue))

方法3:嵌套后提取列表

通过nest()嵌套数据,再提取嵌套列转为列表,同时保留分组列:

df1 <- df |> 
  group_by(tissue) |> 
  nest(data = genes) |> 
  mutate(data = map(data, ~ mutate(.x, tissue = cur_group()$tissue))) |> 
  pull(data)

原因说明

group_map()默认会将分组列从传递给自定义函数的子数据框中移除,只保留非分组列,因此直接使用~.会丢失tissue列;而group_split()设计时就保留了分组列,是更适合该场景的工具。

内容的提问来源于stack exchange,提问作者LDT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:35:24