拆分数据框列表和 return 单独的列表条目而不是子列表

Split list of dataframes and return separate list entries instead of sublists

我有一个数据框列表,我想根据列进行拆分,在这种情况下是 cluster 列。

d1 <- data.frame(y1=c(1,2,3), cluster=c(1,2,6))
d2 <- data.frame(y1=c(3,2,1), cluster=c(6,2,4))

my.list <- list(d1, d2)

正在使用 lapply(my.list , function(x) split(x, x$cluster)) returns 拆分的数据帧作为子列表。是否可以拆分数据帧并创建新的数据帧作为单独的列表条目?

期望的输出是这样的:

my.list2 <- list(df1_cl1 , df1_cl2m df1_cl6, df2_cl6, df2_cl2, df2_cl4 )

第一步是正确的,要获取所需结构的数据,您可以 unlist 使用 recursive = FALSE 的列表输出。

my.list2  <- unlist(lapply(my.list , function(x) 
                    split(x, x$cluster)), recursive = FALSE)

my.list2
#$`1`
#  y1 cluster
#1  1       1

#$`2`
#  y1 cluster
#2  2       2

#$`6`
#  y1 cluster
#3  3       6

#$`2`
#  y1 cluster
#2  2       2

#$`4`
#  y1 cluster
#3  1       4

#$`6`
#  y1 cluster
#1  3       6

length(my.list2)
#[1] 6

您可以使用 unname(my.list2) 删除列表的名称。

另一种可能的解决方案,基于 dplyr:group_splitpurrr::map

library(tidyverse)

map(my.list, ~ group_split(.x, .x$cluster, .keep = F)) %>% flatten

#> [[1]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     1       1
#> 
#> [[2]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     2       2
#> 
#> [[3]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     3       6
#> 
#> [[4]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     2       2
#> 
#> [[5]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     1       4
#> 
#> [[6]]
#> # A tibble: 1 × 2
#>      y1 cluster
#>   <dbl>   <dbl>
#> 1     3       6