Как получить имена внутри рамки - PullRequest
4 голосов
/ 15 мая 2019

Я хочу получить сводку по нескольким столбцам в фрейме данных по группам.Я использую dplyr::group_by и dplyr::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

Создано в 2019-05-15 с помощью пакета Представить (v0.2.1)

Как видите, столбцыназываются value, value1 и т. д., в то время как я хотел бы, чтобы они были Sepal.Length, Sepal.Width и т. д. После того, как я получу этот результат, конечно, можно назвать столбцы вручную, но я думаю,есть лучший способ сделать это, используя аргумент value tibble::enframe.

В качестве альтернативы, в настоящее время я использую следующий метод.Требуются поддельные данные, что также не является предпочтительным.

iris %>%
  group_by(Species) %>%
  summarise_if(.predicate = is.numeric,
               .funs = ~ list(summary(object = .))) %>%
  unnest() %>%
  group_by(Species) %>%
  mutate(Statistic = names(x = summary(object = rnorm(n = 1)))) %>%
  ungroup() %>%
  select(Species, Statistic, everything())

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 15 мая 2019

Может быть так? Я не сортировал его по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...