r - 如何将多列的频率计数与与 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 值。谢谢您的支持!
解决方案
类似的东西适用于您的示例(我已在数据框中添加了一个位置):
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
但是,我相信您的数据可能更复杂。如果这不能很好地扩展到您的数据集,那么如果您可以为我们提供一个更复杂的示例,该示例更类似于您的原始数据框,将会很有帮助。
推荐阅读
- c# - 代表调用无法更新已打开的报告
- c++ - bool 函数不能作为 while 条件工作
- c++ - 执行 EXE windows 服务时 C++ 中的 CAS 策略错误
- java - 点击登录按钮并尝试获取片段 EditText 值时应用程序崩溃
- java - Microsoft graph API Java HTTP 客户端不允许通过补丁更新
- wordpress - 特征图像未显示为标题图像或使用 undsgn 的 uncode 主题发布缩略图
- node.js - 测试用例 React 与 Node js
- javascript - 使用 THREE.js 渲染 webXR AR 场景的正确方法是什么?
- java - 如何使用 Java Native Access 从打开的 Windows 控制台(命令提示符)读取内容
- uicolor - iOS13:如何在资产目录中为提升的用户界面级别指定颜色