在 R 中随机分配变化 strata/group 的字符变量

randomly assign character variables that vary by strata/group in R

我正在尝试制作一个模拟员工数据集来练习一些分析。我已经有一个模拟数据集,其中包含假员工姓名、工作 ID、性别和种族。我还想添加其他变量,例如主管身份和薪酬等级。然而,例如,在实际数据集中,男性员工比女性员工更有可能成为主管,所以与其告诉 R 将 30% 的案例设为主管,70% 为非主管,我希望 R 将 20% 的案例设为女性案件和 30% 的男性案件主管。

我试过将 case_when() 或 group_by() 与 sample() 函数一起使用,但我无法让它工作。

一个理想的解决方案将能够比二分变量进一步扩展,因为薪酬等级和种族有 5 个级别。此外,如果我可以扩展解决方案以考虑多个变量(例如,性别和种族),那将是最好的。

这是一些假数据,其中有 5 名男性和 5 名女性。对于这种情况,假设我想要 40% 的男性案件主管 (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)),
  ))

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