分组数据框列表

Roy*_*lTS -3 r tidyverse

我有一个包含分组名称的数据框,如下所示:

df <- data.frame(group = rep(letters[1:2], each=2),
                 name = LETTERS[1:4])
> df
  group name
1     a    A
2     a    B
3     b    C
4     b    D
Run Code Online (Sandbox Code Playgroud)

我想将其转换为一个列表,该列表键入组名并包含名称.示例输出:

df_out <- list(a=c('A', 'B'),
               b=c('C', 'D'))

> df_out
$a
[1] "A" "B"

$b
[1] "C" "D"
Run Code Online (Sandbox Code Playgroud)

这不是一个新问题,但我想在tidyverse中完全做到这一点.

Jaa*_*aap 9

据我所知,在tidyverse中还没有这样的功能.因此,你必须自己编写:

split_tibble <- function(tibble, col = 'col') tibble %>% split(., .[,col])
Run Code Online (Sandbox Code Playgroud)

然后:

dflist <- split_tibble(df, 'group')
Run Code Online (Sandbox Code Playgroud)

导致数据帧的结果:

> dflist
$a
  group name
1     a    A
2     a    B

$b
  group name
3     b    C
4     b    D

> sapply(dflist, class)
           a            b 
"data.frame" "data.frame" 
Run Code Online (Sandbox Code Playgroud)

要获得所需的输出,您必须稍微扩展一下这个函数:

split_tibble <- function(tibble, column = 'col') {
  tibble %>% split(., .[,column]) %>% lapply(., function(x) x[,setdiff(names(x),column)])
}
Run Code Online (Sandbox Code Playgroud)

现在:

split_tibble(df, 'group')
Run Code Online (Sandbox Code Playgroud)

结果是:

$a
[1] A B
Levels: A B C D

$b
[1] C D
Levels: A B C D
Run Code Online (Sandbox Code Playgroud)

考虑到评论中的备选方案和两个答案,得出以下结论:使用基本R替代方案split(df$name, df$group)更为明智.

  • @Cath重点是一次加载20个包,然后创建使用基R和管道的函数,你怎么能看不到这一点?*<叹>* (4认同)