#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)
Создает это: