我有一个包含分组名称的数据框,如下所示:
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中完全做到这一点.
据我所知,在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)更为明智.