代码之家  ›  专栏  ›  技术社区  ›  Laura

根据R中预先确定的概率,将数据集中的个人分配到特定的状态。

  •  0
  • Laura  · 技术社区  · 6 年前

    我有像这样的数据

    df <- data.frame(
    age_grp10 = rep(c("00-09", "10-19", "20-29", "30-39", "40-49", "50-59", "60-    69", "70-79", "80-89"), 2),
    sex = c(rep("M", 9), rep("F", 9)),
    prob_arr = round((runif(18, min = 0.11, max = 2.50)), digits = 2),
    prob_dep = round((runif(18, min = 0.11, max = 2.50)), digits = 2)
    )
    

    这个数据集给出了一个人在一个日历年内到达或离开的概率(按年龄和性别)。

    然后我有人口水平的数据,看起来像这样

      pop_df <- data.frame(
      uniq_ID = c("AFG1234", "WED1234", "POJ1234", "DER234", "QWE1234", "BGR1234", "ABC1234", "DSE1234", "UHJ1234", "POI234",
              "EDC1234", "BGT1234", "MJI1234", "WEX1234", "FGH1234", "UJN1234", "LOK1234", "DRT1234", "URD1234", "MVR1234"),
      age_grp10 = c("50-59", "40-49", "20-29", "40-49", "00-09",  "50-59", "30-39", "70-79",  "60-69", "40-49",
                "80-89", "10-19", "30-39", "30-39", "50-59", "70-79", "00-09", "70-79", "20-29", "20-29"),
      sex = c("M", "M", "F", "M", "F", "F", "F", "M", "F", "M", "F", "F", "M", "M", "M", "M", "M", "F", "M", "F"))
    

    在这个人口数据集中,每行都是一个个体,大约有500万人。它显示了他们的年龄和性别,以及唯一的身份证号码。 基于第一个数据框(df)中的概率,我想将到达和离开状态分配给人口数据框(pop_df)中的个人。

    我想要的输出看起来像

    pop_df <- pop_df %>%
    left_join(df) %>%
    mutate(Arrived = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
         Departed = c(1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
    

    在最后一个数据集中,到达和离开的值取决于df数据帧中的概率。因此,根据df数据框中prob_arr的值,0-9岁男性中的xx%将被分配到到达状态。

    谢谢你的帮助

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gregor Thomas    6 年前

    假设(a)概率是百分比,(b)它们是独立的,这里有一个简单的方法 dplyr :

    library(dplyr)
    pop_df %>% left_join(df) %>%
      mutate(Arrived = as.integer(runif(n()) * 100 < prob_arr),
             Departed = as.integer(runif(n()) * 100 < prob_dep))
    

    尽管同样的逻辑在 base :

    joined_df = merge(pop_df, df)
    transform(
      joined_df,
      Arrived = as.integer(runif(nrow(joined_df)) * 100 < prob_arr),
      Departed = as.integer(runif(nrow(joined_df)) * 100 < prob_dep)
    )
    
    推荐文章