Как объединить подсчет частоты нескольких столбцов с транспонированием категориальных переменных, связанных со сводной статистикой в ​​R - PullRequest
0 голосов
/ 17 ноября 2018

Предположим, у меня есть очень большой набор данных, в котором хранятся тысячи профилей домохозяйств, размеры которых составляют до 11 членов.Порядок данных приведен в таблице ниже, где у меня есть пол каждого члена домохозяйства, его / ее профессия (скажем, 20 типов предопределенных категорий) и его / ее доход для каждого источника дохода.

Gender1 <- c("M","F")
Gender2 <- c("F", "M")
Work1 <- c("A", "B")
Work2 <- c("B","A")
RevenueA <- c(10,20)
RevenueB <- c(20,10)
df <- data.frame(Gender1, Gender2, Work1, Work2, RevenueA, RevenueB)

enter image description here

Теперь мой вызов кода R состоит в том, чтобы получить подсчет частоты того, сколько мужчин и женщин работают в каждом кодифицированном секторе (работа 1, работа 2 до20 категорий) и средняя величина дохода, заявленная каждым полом по всем предопределенным категориям.Я хочу сохранить типы секторов в качестве меток в выходной таблице.Пример выходных данных показан в таблице ниже:

enter image description here

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

enter image description here

В последнем примечании кадр данныхтакже имеет несколько значений NA.Спасибо за вашу поддержку!

1 Ответ

0 голосов
/ 17 ноября 2018

Нечто подобное будет работать на вашем примере (я добавил местоположение в фрейм данных):

library(tidyverse)

Gender1 <- c("M","F")
Gender2 <- c("F", "M")
Work1 <- c("A", "B")
Work2 <- c("B","A")
RevenueA <- c(10,20)
RevenueB <- c(20,10)
Location <- c("ABC", "ABC")
df <- data.frame(Location, Gender1, Gender2, Work1, Work2, RevenueA, RevenueB)

df %>%
  gather(key_gen, value_gen, which(grepl("Gender", colnames(.)))) %>%
  gather(key_work, value_work, which(grepl("Work", colnames(.)))) %>%
  gather(key_reven, value_reven, which(grepl("Revenue", colnames(.)))) %>%
  mutate(
    gen_id = gsub(".*(\\d+$)", "\\1", key_gen),
    work_id = gsub(".*(\\d+$)", "\\1", key_work),
    reven_id = gsub("Revenue", "", key_reven),
    key_work = "Work", key_gen = "Gender", key_reven = "Revenue"
  ) %>%
  filter(gen_id == work_id & value_work == reven_id) %>%
  select(-contains("_id"), -key_reven) %>%
  add_count(value_gen, value_work) %>%
  group_by(value_gen, value_work) %>%
  mutate(
    mean_reven = paste0("MeanRevenue", value_work),
    mean_reven_n = mean(value_reven, na.rm = TRUE),
    key_work = paste0(key_work, value_work)
  ) %>% ungroup() %>% 
  distinct(Location, key_gen, value_gen, key_work, n, mean_reven, mean_reven_n) %>%
  spread(key_gen, value_gen) %>%
  spread(key_work, n) %>%
  spread(mean_reven, mean_reven_n) %>%
  mutate_at(vars(contains("Work"), contains("MeanRevenue")), funs(replace(., is.na(.), 0)))

Выход:

  Location Gender WorkA WorkB MeanRevenueA MeanRevenueB
  <fct>    <chr>  <dbl> <dbl>        <dbl>        <dbl>
1 ABC      F          0     2            0           15
2 ABC      M          2     0           15            0

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...