【问题标题】:randomly assign character variables that vary by strata/group in R在 R 中随机分配因层/组而异的字符变量
【发布时间】:2020-02-18 19:14:40
【问题描述】:

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

我已经尝试使用 case_when() 或 group_by() 以及 sample() 函数,但我无法让它工作。

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

以下是 5 名男性和 5 名女性病例的一些虚假数据。对于这个案例,假设我想要 40% 的男性案例主管 (2/5),而只需要 20% 的女性案例主管 (1/5)。 p>

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"))

【问题讨论】:

    标签: r random dplyr grouping sample


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2016-02-23
      • 2018-12-22
      相关资源
      最近更新 更多