根据R中的预定比例,将数据集中的个人分配到特定状态

根据R中的预定比例,将数据集中的个人分配到特定状态,r,random,dplyr,R,Random,Dplyr,我有这样的数据 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 =

我有这样的数据

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"))
df假设(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))

大多数“概率”都大于1——它们是百分比吗?同时,到达和离开是独立的吗?也就是说,将一个人同时标记为到达和离开是否有意义?对不起,是的,它们实际上是比例。第三种选择既没有到达也没有离开。他们是独立的,尽管在同一年内有人到达和离开是不寻常的。谢谢Gregor。到达和离开不是独立的,所以我将其稍微编辑为:
pop_df%>%left_join(df)%%>%mutate(到达=as.integer(runif(n())*100%mutate(离开=case_when(到达=0~as.integer(runif(n())*100
不需要
case\u当你只有一个case时,我会做
变异(到达=as.integer(runif(n())*100
。但这将低估离开人数,因为这将使离开人数占未到达人数的百分比,而不是整个人口的百分比。让我知道这是否有关,我可以编辑一个更好的修复。另一方面,你对这个问题的评论说“有人在同一年到达和离开是不寻常的”,所以你可能想保持原样。你的概率大约为1%,有人到达和离开的概率大约为1%*1%=0.01%,这确实很不寻常。如果您按照上面的注释进行修复,修复率将为0%。感谢您的帮助@Gregor。我想我可能解释错了,因为当我运行这段代码时,我没有得到我所期望的移民数量。对于年龄和性别的每一种组合,我都有一个固定数量的人在一年内离开或到达。我希望在运行您提供的代码之后,预期到达或离开的人数将等于观察到的总人数。但事实并非如此,我不理解这种说法。让我们更具体一点。您的
df
的第一行显示了0-9岁的男性,并给出了
prob_arr
的1.45。现在,作为一个严格的概率,这是没有意义的,因为概率和比例必须在0和1之间。所以,我假设这是一个*百分比,即1.45%=0.0145比例(或概率)。因此,我的代码所做的是,在大的
pop_df
0-9岁年龄组中,给每个男性一个0.0145被标记为到达的概率。。。。
library(dplyr)
pop_df %>% left_join(df) %>%
  mutate(Arrived = as.integer(runif(n()) * 100 < prob_arr),
         Departed = as.integer(runif(n()) * 100 < prob_dep))
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)
)