首页 > 解决方案 > 如何将多列的频率计数与与 R 中的汇总统计相关的分类变量的转置结合起来

问题描述

假设我有一个非常大的数据集,其中存储了多达 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)

在此处输入图像描述

现在,我的 R 代码挑战是获取每个编纂部门(工作 1、工作 2 最多 20 个类别)中有多少男性和女性工作的频率计数,以及每个性别在所有预定义类别中声明的平均收入值。我希望将扇区类型作为标签保留在输出表中。输出示例如下表所示:

在此处输入图像描述

在不为代码中的每个工作类别输入标签的情况下获得建议输出的最有效方法是什么?在将位置视为主要聚合时,我还想重复相同的逻辑,如下表所示:

在此处输入图像描述

最后一点,数据帧也有多个 NAs 值。谢谢您的支持!

标签: rfrequencytransposesummaryfrequency-distribution

解决方案


类似的东西适用于您的示例(我已在数据框中添加了一个位置):

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

但是,我相信您的数据可能更复杂。如果这不能很好地扩展到您的数据集,那么如果您可以为我们提供一个更复杂的示例,该示例更类似于您的原始数据框,将会很有帮助。


推荐阅读