Я разочарован выполнением чего-то очень простого в R. Я просто хочу создать сводную таблицу из данных, подобных следующим:
A B C D E
3 6 9 0 1
1 3 9 6 2
1 5 0 9 2
И я хочу преобразовать это в этот формат с помощью строки как исходные имена столбцов, а столбцы как агрегированные статистические данные c:
mean count stdev skew kurtosis
A . . . . .
B . . . . .
C . . . . .
D . . . . .
E . . . . .
До сих пор я пробовал использовать функцию суммирования в dplyr, но это дает нечитаемый вывод при наличии большое количество столбцов (см. ниже). Было бы намного лучше, если бы одна строка представляла входные столбцы, а каждый столбец представлял агрегированное значение. Есть ли простой способ сделать это?
> data %>% summarise_if(is.numeric,
+ c(mean = ~mean(., na.rm = TRUE),
+ mode = ~mode(.)))
# A tibble: 1 x 76
Id_mean MSSubClass_mean LotFrontage_mean LotArea_mean OverallQual_mean OverallCond_mean
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 730. 56.9 70.0 10517. 6.10 5.58
# ... with 70 more variables: YearBuilt_mean <dbl>, YearRemodAdd_mean <dbl>,
# MasVnrArea_mean <dbl>, BsmtFinSF1_mean <dbl>, BsmtFinSF2_mean <dbl>,
# BsmtUnfSF_mean <dbl>, TotalBsmtSF_mean <dbl>, `1stFlrSF_mean` <dbl>,
# `2ndFlrSF_mean` <dbl>, LowQualFinSF_mean <dbl>, GrLivArea_mean <dbl>,
# BsmtFullBath_mean <dbl>, BsmtHalfBath_mean <dbl>, FullBath_mean <dbl>,
# HalfBath_mean <dbl>, BedroomAbvGr_mean <dbl>, KitchenAbvGr_mean <dbl>,
# TotRmsAbvGrd_mean <dbl>, Fireplaces_mean <dbl>, GarageYrBlt_mean <dbl>,
# GarageCars_mean <dbl>, GarageArea_mean <dbl>, WoodDeckSF_mean <dbl>,
# OpenPorchSF_mean <dbl>, EnclosedPorch_mean <dbl>, `3SsnPorch_mean` <dbl>,
# ScreenPorch_mean <dbl>, PoolArea_mean <dbl>, MiscVal_mean <dbl>, MoSold_mean <dbl>,
# YrSold_mean <dbl>, SalePrice_mean <dbl>, Id_mode <chr>, MSSubClass_mode <chr>,
# LotFrontage_mode <chr>, LotArea_mode <chr>, OverallQual_mode <chr>,
# OverallCond_mode <chr>, YearBuilt_mode <chr>, YearRemodAdd_mode <chr>,
# MasVnrArea_mode <chr>, BsmtFinSF1_mode <chr>, BsmtFinSF2_mode <chr>,
# BsmtUnfSF_mode <chr>, TotalBsmtSF_mode <chr>, `1stFlrSF_mode` <chr>,
# `2ndFlrSF_mode` <chr>, LowQualFinSF_mode <chr>, GrLivArea_mode <chr>,
# BsmtFullBath_mode <chr>, BsmtHalfBath_mode <chr>, FullBath_mode <chr>,
# HalfBath_mode <chr>, BedroomAbvGr_mode <chr>, KitchenAbvGr_mode <chr>,
# TotRmsAbvGrd_mode <chr>, Fireplaces_mode <chr>, GarageYrBlt_mode <chr>,
# GarageCars_mode <chr>, GarageArea_mode <chr>, WoodDeckSF_mode <chr>,
# OpenPorchSF_mode <chr>, EnclosedPorch_mode <chr>, `3SsnPorch_mode` <chr>,
# ScreenPorch_mode <chr>, PoolArea_mode <chr>, MiscVal_mode <chr>, MoSold_mode <chr>,
# YrSold_mode <chr>, SalePrice_mode <chr>
РЕДАКТИРОВАТЬ
Я закончил писать свою собственную функцию, вот с примером.
ttsummary <- function(data, funcs){
st <- as_tibble(names(data))
for (i in 1:length(funcs)){
tmp <- t(summarise_all(data, funcs[[i]]))[,1]
st <- add_column(st, tmp, .name_repair = "unique")
}
names(st) <- append("column", names(funcs))
return(st)
}
sf <- c(mean = ~mean(.,na.rm = TRUE),
num_zeros = ~sum(. == 0, na.rm =TRUE),
kurt = ~kurtosis(., na.rm = TRUE),
nans = ~sum(is.na(.)))
numerical_cols <- select_if(data, is.numeric)
sumtable <- ttsummary(numerical_cols, sf)
Вывод лучше:
> sumtable
# A tibble: 38 x 6
column mean num_zeros skew kurt nans
<chr> <dbl> <int> <dbl> <dbl> <int>
1 Id 730. 0 0 1.80 0
2 MSSubClass 56.9 0 1.41 4.57 0
3 LotFrontage 70.0 0 NA 20.4 259
4 LotArea 10517. 0 12.2 206. 0
5 OverallQual 6.10 0 0.217 3.09 0
6 OverallCond 5.58 0 0.692 4.10 0
7 YearBuilt 1971. 0 -0.613 2.56 0
8 YearRemodAdd 1985. 0 -0.503 1.73 0
9 MasVnrArea 104. 861 NA 13.0 8
10 BsmtFinSF1 444. 467 1.68 14.1 0
# ... with 28 more rows