Создание читаемой сводной таблицы в R - PullRequest
0 голосов
/ 30 апреля 2020

Я разочарован выполнением чего-то очень простого в 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

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я думаю, вы можете получить то, что вы хотите с кодом, подобным этому:

library(dplyr)

data %>%
  pivot_longer(cols = everything(), names_to = "name") %>%
  group_by(name) %>%
  summarise(mean = mean(value, na.rm = T),
            count = n(),
            num_zeros = sum(value == 0, na.rm = T),
            stddev = sd(value, na.rm = T),
            skew = skewness(value, na.rm = T),
            kurtosis = kurtosis(value, na.rm = T))

Это дает:

# A tibble: 5 x 7
  name   mean count num_zeros stddev   skew kurtosis
  <chr> <dbl> <int>     <int>  <dbl>  <dbl>    <dbl>
1 A      1.67     3         0  1.15   0.707    -1.5 
2 B      4.67     3         0  1.53  -0.382    -1.50
3 C      6        3         1  5.20  -0.707    -1.5 
4 D      5        3         1  4.58  -0.382    -1.5 
5 E      1.67     3         0  0.577 -0.707    -1.50
0 голосов
/ 01 мая 2020

Вот несколько примеров данных (случайных чисел) в таблице:

> tb <- tibble(a = runif(10), b = runif(10), c = runif(10))

Для простоты вы можете apply функцию summary для каждого столбца и транспонировать результат:

> t(apply(tb, 2, summary))
        Min.   1st Qu.    Median      Mean   3rd Qu.      Max.
a 0.10229290 0.3225723 0.6844522 0.6002692 0.8531150 0.9738351
b 0.07245512 0.1013346 0.2903517 0.3125040 0.3552238 0.7523021
c 0.08806440 0.5417125 0.7411031 0.6653970 0.8449542 0.9967269

Если вам нужна пользовательская сводка, напишите простую функцию сводки для вектора значений. Вы можете поместить в эту функцию любую сводную статистику и назвать ее как угодно.

> mySummary <- function(x) {
    c(
      mean = mean(x),
      sd = sd(x),
      max = max(x),
      min = min(x)
    )
  }

Опять apply ваша пользовательская сводная функция для каждого столбца данных примера и транспонировать.

> t(apply(tb, 2, mySummary))

       mean        sd       max        min
a 0.6002692 0.3073846 0.9738351 0.10229290
b 0.3125040 0.2469551 0.7523021 0.07245512
c 0.6653970 0.2604780 0.9967269 0.08806440
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...