r - 在 R 中随机分配因层/组而异的字符变量
问题描述
我正在尝试制作一个模拟员工数据集来练习一些分析。我已经有一个模拟数据集,其中包含虚假的员工姓名、工作 ID、性别和种族。我还想添加其他变量,例如主管身份和薪酬等级。但是,例如,在实际数据集中,男性员工比女性员工更有可能成为主管,因此我希望 R 让 20% 的女性员工成为主管,而不是让 R 让 30% 的案例成为主管和 70% 的非主管案件和 30% 的男性案件主管。
我已经尝试使用 case_when() 或 group_by() 以及 sample() 函数,但我无法让它工作。
一个理想的解决方案将能够进一步扩展,而不仅仅是二分变量,因为薪酬等级和种族有 5 个级别。此外,如果我可以扩展解决方案以考虑多个变量(例如,性别和种族),那将是最好的。
这是一些包含 5 名男性和 5 名女性病例的虚假数据。对于这种情况,假设我想要 4 0% 的男性案件主管 (2/5)和只有20% 的女性案件主管 (1/5)。
library(tidyverse)
test <- tibble(emp_num = 1:10,
ethnicity = c("White", "White", "Hispanic", "Black", "Asian", "White", "White", "Hispanic", "Black", "Asian"),
gender = c("Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"))
以下是正确比例的答案(当然,在这种情况下,哪个员工编号是主管并不重要,只要出现男性和女性的不同比例即可)。
sample_answer <- tibble(emp_num = 1:10,
ethnicity = c("White", "White", "Hispanic", "Black", "Asian", "White", "White", "Hispanic", "Black", "Asian"),
gender = c("Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"),
sup_status = c("Supervisor", "Supervisor", "Supervisor", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super", "Non-Super"))
解决方案
在对我在发布之前编写的代码和@Lukas 发布的答案进行故障排除后,我发现了问题所在。size 参数需要等于总样本量,replace 参数需要设置为 TRUE
test <- test %>% mutate(supervisor = case_when(
gender == "Male" ~ sample(c("Supervisor", "Non-Super"), nrow(test), replace = TRUE prob=(c(.4, .6))),
gender == "Female" ~ sample(c("Supervisor", "Non-Super"), nrow(test), replace = TRUE prob=(c(.2, .8))))
在这个小样本量中,您可能找不到这些概率的精确细分,但我在我的 5000 个样本上运行了此代码,并且概率在舍入误差范围内。
编辑:如果您希望新变量因多个组而异(例如性别和种族,您可以在任何情况下都可以这样做。例如:
library(tidyverse)
test %>%
mutate(sup_status = case_when(
gender == "Female" & ethnicity == "Black" | ethnicity == "Asian" | ethnicity == "Hispanic" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.10, .90)),
gender == "Female" & ethnicity == "White" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.20, .80)),
gender == "Male" & ethnicity == "Black" | ethnicity == "Asian" | ethnicity == "Hispanic" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.15, .85)),
gender == "Male" & ethnicity == "White" ~ sample(c("Supervisor", "Not Supervisor"), nrow(test), replace=TRUE, prob=c(.25, .75)),
))
同样,对于如此小的样本数据集,您不会看到具有这些精确概率的输出,但对于较大的数据集,它会起作用。
推荐阅读
- r - 积分和数值优化 (nlminb) R
- python - 当 Debug = False 时,Django 站点找不到管理样式或媒体文件
- .net - 使用 SQLQuery 在 .NET 应用程序中执行存储过程返回不正确的值
- powershell - 根据文件名和扩展名将文件移动到与文件名匹配的文件夹?
- c# - Assembly 认为它的位置在 TestResult 文件夹中
- email - 电子邮件中缺少“$template”参数
- c++ - 搜索向量成员 C++ 的前 n%
- javascript - 在 React 中,父组件如何从响应中设置状态并在子组件中执行异步获取功能?
- flutter - 如何在 Flutter 中使用 Stack、Row 和类似元素独立定位元素
- ios - 如何在swiftui列表中获取textField值