使用dplyr group_split保留数据框名称

时间:2019-08-13 09:59:34

标签: r dplyr

使用dplyr中的group_split,但我需要列表中的每个数据框都保留名称。

dplyr文档中的示例(注意,数据帧已编号。最佳输出是每个数据帧均具有分组变量的名称(Setosa,versicolor ...):

    ir <- iris %>%
  group_by(Species)

group_split(ir)
#> [[1]]
#> # A tibble: 50 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
#>  1          5.1         3.5          1.4         0.2 setosa 
#>  2          4.9         3            1.4         0.2 setosa 
#>  3          4.7         3.2          1.3         0.2 setosa 
#>  4          4.6         3.1          1.5         0.2 setosa 
#>  5          5           3.6          1.4         0.2 setosa 
#>  6          5.4         3.9          1.7         0.4 setosa 
#>  7          4.6         3.4          1.4         0.3 setosa 
#>  8          5           3.4          1.5         0.2 setosa 
#>  9          4.4         2.9          1.4         0.2 setosa 
#> 10          4.9         3.1          1.5         0.1 setosa 
#> # … with 40 more rows
#> 
#> [[2]]
#> # A tibble: 50 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>     
#>  1          7           3.2          4.7         1.4 versicolor
#>  2          6.4         3.2          4.5         1.5 versicolor
#>  3          6.9         3.1          4.9         1.5 versicolor
#>  4          5.5         2.3          4           1.3 versicolor
#>  5          6.5         2.8          4.6         1.5 versicolor
#>  6          5.7         2.8          4.5         1.3 versicolor
#>  7          6.3         3.3          4.7         1.6 versicolor
#>  8          4.9         2.4          3.3         1   versicolor
#>  9          6.6         2.9          4.6         1.3 versicolor
#> 10          5.2         2.7          3.9         1.4 versicolor
#> # … with 40 more rows
#> 
#> [[3]]
#> # A tibble: 50 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>    
#>  1          6.3         3.3          6           2.5 virginica
#>  2          5.8         2.7          5.1         1.9 virginica
#>  3          7.1         3            5.9         2.1 virginica
#>  4          6.3         2.9          5.6         1.8 virginica
#>  5          6.5         3            5.8         2.2 virginica
#>  6          7.6         3            6.6         2.1 virginica
#>  7          4.9         2.5          4.5         1.7 virginica
#>  8          7.3         2.9          6.3         1.8 virginica
#>  9          6.7         2.5          5.8         1.8 virginica
#> 10          7.2         3.6          6.1         2.5 virginica
#> # … with 40 more rows
#> 
#> attr(,"ptype")
#> # A tibble: 0 x 5
#> # … with 5 variables: Sepal.Length <dbl>, Sepal.Width <dbl>,
#> #   Petal.Length <dbl>, Petal.Width <dbl>, Species <fct>

2 个答案:

答案 0 :(得分:5)

group_split不保留名称。来自?group_split

  

它没有基于分组来命名列表的元素,因为这通常会丢失信息并且令人困惑。

您可以为此使用基础base::split

split(iris, iris$Species)

或使用setNames分别命名小标题列表。

library(dplyr)
group_split(ir) %>% setNames(unique(iris$Species))

group_split根据数据的因子水平进行拆分,因此,如果我们想根据它们在数据中的出现进行拆分,则可能必须重新排列因子水平。在iris数据集中,因子水平与数据中出现的因子顺序相同,因此可以进行上述工作。

一般来说,我们应该使用。

iris %>%
  mutate(Species= factor(Species, levels = unique(Species))) %>%
  group_split(Species) %>%
  setNames(unique(iris$Species))

答案 1 :(得分:1)

我们可以使用set_names中的tidyverse

library(tidyverse)
ir %>%
    group_split() %>%
    set_names(levels(iris$Species))