Итоговое форматирование

#r #dataframe #formatting

#r #фрейм данных #форматирование

Вопрос:

Обычный вывод summary() функции — это:

 > summary(iris[, -5])
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500       
  

Я хотел перенести его, а затем поместить во фрейм данных, поэтому я сделал это:

 > trans <- as.data.frame(t(as.matrix(unclass(summary(iris[, -5])))))
> trans
                           V1              V2              V3              V4              V5
 Sepal.Length Min.   :4.300   1st Qu.:5.100   Median :5.800   Mean   :5.843   3rd Qu.:6.400  
 Sepal.Width  Min.   :2.000   1st Qu.:2.800   Median :3.000   Mean   :3.057   3rd Qu.:3.300  
 Petal.Length Min.   :1.000   1st Qu.:1.600   Median :4.350   Mean   :3.758   3rd Qu.:5.100  
 Petal.Width  Min.   :0.100   1st Qu.:0.300   Median :1.300   Mean   :1.199   3rd Qu.:1.800  
                           V6
 Sepal.Length Max.   :7.900  
 Sepal.Width  Max.   :4.400  
 Petal.Length Max.   :6.900  
 Petal.Width  Max.   :2.500  
  

Проблема возникает сейчас. Я полагаю, что более логичным форматом было бы следующее:

 > trans <- cbind(rownames(trans), trans)
> rownames(trans) <- NULL
> colnames(trans) <- c("Treatment", "Minimum", "1st Quartile", "Median", "Mean", "3rd Quartile", "Maximum")
> trans
      Treatment         Minimum    1st Quartile          Median            Mean    3rd Quartile
1  Sepal.Length Min.   :4.300   1st Qu.:5.100   Median :5.800   Mean   :5.843   3rd Qu.:6.400  
2   Sepal.Width Min.   :2.000   1st Qu.:2.800   Median :3.000   Mean   :3.057   3rd Qu.:3.300  
3  Petal.Length Min.   :1.000   1st Qu.:1.600   Median :4.350   Mean   :3.758   3rd Qu.:5.100  
4   Petal.Width Min.   :0.100   1st Qu.:0.300   Median :1.300   Mean   :1.199   3rd Qu.:1.800  
          Maximum
1 Max.   :7.900  
2 Max.   :4.400  
3 Max.   :6.900  
4 Max.   :2.500  
  

Но тогда, как вы можете видеть, имена столбцов повторяются в каждой ячейке. Это что-то очень непривлекательное. Поэтому мой вопрос заключается в том, возможно ли удалить эту часть из data.frame, оставив меня с этим:

       Treatment         Minimum    1st Quartile          Median            Mean    3rd Quartile
1  Sepal.Length         4.300      5.100                 5.800            5.843      6.400  
2  Sepal.Width          2.000      2.800                 3.000            3.057      3.300  
3  Petal.Length         1.000      1.600                 4.350            3.758      5.100  
4  Petal.Width          0.100      0.300                 1.300            1.199      1.800  
          Maximum
1          7.900  
2          4.400  
3          6.900  
4          2.500  
  

Одним из преимуществ этого также будет то, что мой data.frame будет числовым (возможно), а также просто более аккуратным. Как я могу это сделать?

Комментарии:

1. Вы также можете заглянуть в функцию ‘summary ()’ из пакета dplyr, она может лучше выводить и контролировать, чем функция summary

Ответ №1:

Несколько пакетов позволяют суммировать данные таким образом. Например, мой пакет modelsummary (предупреждение о саморекламе!) позволяет вам сделать это:

 library(modelsummary)

datasummary(All(iris) ~ Min   P25   P50   Mean   P75   Max, 
            data = iris,
            output = "data.frame")
#>                 Min  P25  P50 Mean  P75  Max
#> 1 Sepal.Length 4.30 5.10 5.80 5.84 6.40 7.90
#> 2  Sepal.Width 2.00 2.80 3.00 3.06 3.30 4.40
#> 3 Petal.Length 1.00 1.60 4.35 3.76 5.10 6.90
#> 4  Petal.Width 0.10 0.30 1.30 1.20 1.80 2.50
  

Удаление output аргумента создает таблицу HTML, которая выглядит следующим образом:

введите описание изображения здесь

И вызывая это:

 datasummary_skim(iris)
  

Создает это:

введите описание изображения здесь