Как преобразовать агрегированные подсчеты в таблицу непредвиденных расходов? - PullRequest
1 голос
/ 31 марта 2020

Я хотел бы использовать таблицу данных переписей нескольких стран и составить таблицу непредвиденных расходов со строкой / столбцом / общим процентом. Я борюсь с тем, что данные уже агрегированы в виде таблицы сопряженности. Как преобразовать необработанные данные в таблицу на случай непредвиденных обстоятельств?

set.seed(1)
country <- c(rep("countryA", 6), rep("countryB", 6))
age <- c(rep(c("0-14", "15-24", "25-59"), 2), rep(c("0-18", "18-30", "30-60"), 2))
sex <- rep(c(rep("female", 3), rep("male", 3)), 2)
count <- abs(round(rnorm(12, 1000000, 500000)))
df <- data.frame(country, age, sex, count)

Обратите внимание, что в данных, которые я имею в разных бюро отчетов о переписи, данные переписи для разных возрастных групп представлены в MWE.

То, что я хотел бы, это:

[[1]] CountryA
                  0-14                15-24                25-59
Female            row/col/total%      row/col/total%       row/col/total%      Row margins %
Male              row/col/total%      row/col/total%       row/col/total%      Row margins %
                  Column margins %    Column margins %     Column margins %    Total margins %

[[2]] CountryB
                  0-18                18-30                30-60
Female            row/col/total%      row/col/total%       row/col/total%      Row margins %
Male              row/col/total%      row/col/total%       row/col/total%      Row margins %
                  Column margins %    Column margins %     Column margins %    Total margins %

Где row / col / total% должны быть варианты для выбора и не обязательно должны отображаться в той же таблице. Я также гибок в отношении класса конечного результата. Я представляю, что это список, но это не должно быть.

Мне известно о prop.table (table (), margins = 1/2), janitor :: tabyl (), gmodels: : CrossTable (), stats :: xtabs, Deducer :: contingency.tables, а также http://pcwww.liv.ac.uk/~william/R/crosstab.r. Проблема, которую я имею с каждым из этих пакетов, заключается в том, что они принимают отдельные наблюдения в качестве входных данных, и я не могу заставить их работать с агрегированными подсчетами.

Бонус: в дополнение к процентам было бы неплохо переформатировать фрейм данных в таблицу отсчетов, которая будет выглядеть так же, как я показал, но для подсчетов исходного фрейма данных.

1 Ответ

1 голос
/ 31 марта 2020

Можно указать split набор данных по 'стране', создать сводную таблицу с xtabs и применить prop.table

lapply(split(df[-1], df$country), 
        function(x) prop.table(xtabs(count ~ sex + age, droplevels(x))))

Также возможно, что ОП хотел

lapply(split(df[-1], df$country), function(x) {
   x1 <- xtabs(count ~ sex + age, droplevels(x))
   x2 <- addmargins(x1)
   x2[-nrow(x2),-ncol(x2)] <- x2[-nrow(x2),-ncol(x2)]/x2[nrow(x2),
                      -ncol(x2)]/x2[length(x2)]
   x2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...