首页 > 解决方案 > 在 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"))

标签: rrandomdplyrgroupingsample

解决方案


在对我在发布之前编写的代码和@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)),
  ))

同样,对于如此小的样本数据集,您不会看到具有这些精确概率的输出,但对于较大的数据集,它会起作用。


推荐阅读