Присвоить индивида в наборе данных определенному состоянию на основе заданных пропорций в R - PullRequest
0 голосов
/ 30 мая 2019

У меня есть данные, которые выглядят так

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

В этом наборе данных о населении каждый ряд индивидуален для примерно 5 миллионов человек. Он показывает их возраст и пол, а также уникальный идентификационный номер. Основываясь на пропорциях в первом кадре данных (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. Таким образом, XX% мужчин в возрасте 0-9 лет будет присвоен статус прибытия на основе значения prob_arr в кадре данных df.

Спасибо за вашу помощь

1 Ответ

1 голос
/ 30 мая 2019

Предполагая, что (а) вероятности являются процентами, и (б) они независимы, вот простой метод в 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)
)
...