如何在Enframe中获取名称

时间:2019-05-15 13:32:38

标签: r

我想对一个数据帧进行多列汇总。我正在使用dplyr::group_bydplyr::summarise_if来获取结果,但是无法根据正在汇总的列的名称来命名列。

以下示例对此进行了说明:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)
library(tidyr)

iris %>%
  group_by(Species) %>%
  summarise_if(.predicate = is.numeric,
               .funs = ~ list(enframe(x = summary(object = .)))) %>%
  unnest() %>%
  select(which(x = !duplicated(x = lapply(X = .,
                                          FUN = summary))))
#> # A tibble: 18 x 6
#>    Species    name    value value1 value2 value3
#>    <fct>      <chr>   <dbl>  <dbl>  <dbl>  <dbl>
#>  1 setosa     Min.     4.3    2.3    1     0.1  
#>  2 setosa     1st Qu.  4.8    3.2    1.4   0.2  
#>  3 setosa     Median   5      3.4    1.5   0.2  
#>  4 setosa     Mean     5.01   3.43   1.46  0.246
#>  5 setosa     3rd Qu.  5.2    3.68   1.58  0.3  
#>  6 setosa     Max.     5.8    4.4    1.9   0.6  
#>  7 versicolor Min.     4.9    2      3     1    
#>  8 versicolor 1st Qu.  5.6    2.52   4     1.2  
#>  9 versicolor Median   5.9    2.8    4.35  1.3  
#> 10 versicolor Mean     5.94   2.77   4.26  1.33 
#> 11 versicolor 3rd Qu.  6.3    3      4.6   1.5  
#> 12 versicolor Max.     7      3.4    5.1   1.8  
#> 13 virginica  Min.     4.9    2.2    4.5   1.4  
#> 14 virginica  1st Qu.  6.22   2.8    5.1   1.8  
#> 15 virginica  Median   6.5    3      5.55  2    
#> 16 virginica  Mean     6.59   2.97   5.55  2.03 
#> 17 virginica  3rd Qu.  6.9    3.18   5.88  2.3  
#> 18 virginica  Max.     7.9    3.8    6.9   2.5

reprex package(v0.2.1)于2019-05-15创建

如您所见,这些列分别命名为valuevalue1等,而我希望它们分别为Sepal.LengthSepal.Width等。得到这个结果,当然可以手动命名列,但是我想有一种更好的方法可以使用value的{​​{1}}参数来实现。

作为一种选择,我目前正在使用以下方法。它需要伪造的数据,这也不可取。

tibble::enframe

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

可能会这样吗?我没有按照每个name中的Species对其进行排序,但是我认为这并不重要。

library(tidyverse)

iris %>%
  group_by(Species) %>%
  summarise_if(is.numeric, . ~ list(enframe(summary(.)))) %>%
  gather('key', 'value', -Species) %>%
  unnest() %>%
  spread(key, value)

## A tibble: 18 x 6
#   Species    name    Petal.Length Petal.Width Sepal.Length Sepal.Width
#   <fct>      <chr>          <dbl>       <dbl>        <dbl>       <dbl>
# 1 setosa     1st Qu.         1.4        0.2           4.8         3.2 
# 2 setosa     3rd Qu.         1.58       0.3           5.2         3.68
# 3 setosa     Max.            1.9        0.6           5.8         4.4 
# 4 setosa     Mean            1.46       0.246         5.01        3.43
# 5 setosa     Median          1.5        0.2           5           3.4 
# 6 setosa     Min.            1          0.1           4.3         2.3 
# 7 versicolor 1st Qu.         4          1.2           5.6         2.52
# 8 versicolor 3rd Qu.         4.6        1.5           6.3         3   
# 9 versicolor Max.            5.1        1.8           7           3.4 
#10 versicolor Mean            4.26       1.33          5.94        2.77
#11 versicolor Median          4.35       1.3           5.9         2.8 
#12 versicolor Min.            3          1             4.9         2   
#13 virginica  1st Qu.         5.1        1.8           6.22        2.8 
#14 virginica  3rd Qu.         5.88       2.3           6.9         3.18
#15 virginica  Max.            6.9        2.5           7.9         3.8 
#16 virginica  Mean            5.55       2.03          6.59        2.97
#17 virginica  Median          5.55       2             6.5         3   
#18 virginica  Min.            4.5        1.4           4.9         2.2