拆分数据框列表和 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_split
和 purrr::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
我有一个数据框列表,我想根据列进行拆分,在这种情况下是 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_split
和 purrr::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