如何用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
相关产品推荐
相关产品推荐

