Создание сводной статистической таблицы из нескольких категорий в переменной - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть фрейм данных, который выглядит примерно так:

 ID    category                          Household Income     Tercile   
  1     unmarried couple                    100,000             Middle
  2     married couple                      150,000             Bottom
  3     single Female head of Household     90,000              Top
  4     single Male Head of Household       80,000              Bottom

Я хочу создать сводную статистическую таблицу, которая показывает sd, среднее, min, max, медиану дохода домохозяйства для каждого наблюдения, сгруппированного по каждой категории И tercile.

Мне удалось создать аналогичную таблицу для одной из категорий. Это код для не состоящих в браке пар:

Сначала я отделил категорию от общего фрейма данных и удалил ненужные мне переменные:

status_unmarried <- merged_data %>% 
select(-(person_id:is_college_graduate)) %>%
select(-(is_urban:is_owner_of_home)) %>%
filter(category == 'unmarried couple') %>%
group_by(hh_income, tercile_of_census_tract_income) %>% 
distinct(hh_id, .keep_all = TRUE)

Затем генерируется необходимая сводная статистика:

library(dplyr)
table_one <- tableby(tercile_of_census_tract_income ~ ., data = 
status_unmarried)
summary(table_one, title = "Unmarried households")

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

        Unmarried Couple   Married Couple  Single Female Head Single Male Head

Bottom
Mean
Median
Min
Max
SD
Sample Size

Middle
Mean
Median
Median
Min
Max
SD
Sample Size

Top
Mean
Median
Min
Max
SD
Sample Size

Размер выборки показывает, сколько домохозяйств относится к каждой категории. Поэтому я хочу, чтобы столбцы были категориями, а каждая строка - статистикой, но далее делится на трицил. Я хочу создать фрейм данных или сводную таблицу с этими результатами.

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Попробуйте этот код из пакета data.table . Возможно, вам придется преобразовать dataframe в data.table с помощью функции as.data.table . Учитывая, что имя фрейма данных dt,

dt[, .(Min=min(Income), First_quartile=quantile(Income, 0.1),
   Median=quantile(Income, 0.5), Mean=mean(Income),
   Third_Quartile=quantile(Income, 0.75),
   Max=max(Income)) ,
by=.(Category, Tercile)]

Это создаст таблицу в другом формате, но я думаю, что она более организована.

0 голосов
/ 24 апреля 2019

Рассмотрим вложенные базовые R by, которые предоставляют консольный отчет с разрывами разделов и заголовками:

tercile_agg_df_list <- by(random_df, random_df$Tercile, function(sub_df) {
   by_list <- by(sub_df, sub_df$category, function(core_df)          
     with(core_df,
          c(mean = mean(Household_Income),  median = median(Household_Income), 
            min = min(Household_Income), max = max(Household_Income),
            sd = sd(Household_Income), sample_size = length(Household_Income))
         )
     )       
   t(do.call(rbind, by_list))
})

tercile_agg_df_list
# random_df$Tercile: Bottom
#             Married Couple Single Female Head Single Male Head Unmarried Couple
# mean             44632.894        50204.52677        58095.923       52521.3178
# median           49678.238        50042.54136        62158.775       51933.3694
# min               1989.695           95.23595         6220.779         676.9893
# max              95896.827        98471.19979        98317.740       94795.6344
# sd               29246.103        31317.47006        25728.368       28013.6172
# sample_size         35.000           56.00000           44.000          39.0000
# ---------------------------------------------------------------------------------- 
# random_df$Tercile: Middle
#             Married Couple Single Female Head Single Male Head Unmarried Couple
# mean             56302.818          54845.140        42645.032         48222.93
# median           63245.388          51364.262        39126.608         49713.41
# min               2690.053           5286.126         3687.153          3430.90
# max              99327.726          99216.564        98645.000         98400.38
# sd               28582.935          32262.149        29996.185         28485.63
# sample_size         42.000             44.000           38.000            44.00
# ---------------------------------------------------------------------------------- 
# random_df$Tercile: Top
#             Married Couple Single Female Head Single Male Head Unmarried Couple
# mean             51437.876         45495.1326     55150.495621        44958.808
# median           54592.978         42051.5708     56452.659052        45982.775
# min               3917.729           376.2815         1.451327         1216.967
# max              99638.078         95885.3950     99429.982156        99412.446
# sd               27627.480         26643.9194     30690.131884        29713.131
# sample_size         46.000            39.0000        31.000000           42.000

Данные

set.seed(4242019)
categs <- c("Unmarried Couple", "Married Couple", "Single Female Head", "Single Male Head")

random_df <- data.frame(
  category = sample(categs, 500, replace=TRUE),
  Tercile = sample(c("Bottom", "Middle", "Top"), 500, replace=TRUE),
  Household_Income = runif(500) * 10E4
)

head(random_df)
#           category Tercile Household_Income
# 1 Unmarried Couple  Bottom        70118.908
# 2   Married Couple     Top        24069.175
# 3 Unmarried Couple     Top         1216.967
# 4 Unmarried Couple  Bottom        47936.147
# 5   Married Couple     Top        80633.299
# 6   Married Couple     Top        46136.093
...