从数据帧的子集进行采样,其中该子集以R中另一个数据帧的值为条件

从数据帧的子集进行采样,其中该子集以R中另一个数据帧的值为条件,r,dataframe,dplyr,R,Dataframe,Dplyr,我在R中有两个数据帧。其中一行包含每个人及其居住区域的行。例如 df1=data.frame(人名=seq(1,10,1),区域=c(“A”、“A”、“A”、“B”、“B”、“c”、“D”、“A”、“D”、“c”)) 另一个数据框包含每个区域的人口统计信息 例如,对于性别df2=数据帧(面积=c(“A”、“A”、“B”、“B”、“c”、“c”、“D”、“D”),性别=c(“M”、“F”、“M”、“F”、“M”、“F”、“F”、“F”、“M”、“F”),概率=c(0.4,0.6,0.55,0.45

我在
R
中有两个数据帧。其中一行包含每个人及其居住区域的行。例如

df1=data.frame(人名=seq(1,10,1),区域=c(“A”、“A”、“A”、“B”、“B”、“c”、“D”、“A”、“D”、“c”))

另一个数据框包含每个
区域的人口统计信息

例如,对于性别
df2=数据帧(面积=c(“A”、“A”、“B”、“B”、“c”、“c”、“D”、“D”),性别=c(“M”、“F”、“M”、“F”、“M”、“F”、“F”、“F”、“M”、“F”),概率=c(0.4,0.6,0.55,0.45,0.6,0.4,0.5,0.5))

df1
中,我想创建一个性别列,其中对于
df1
的每一行,我从
df2
的适当子集中采样性别。 例如,对于
df1
的第1行,我将从
df2%>%过滤器(Area==“a”)


问题是如何对没有for循环的所有行执行此操作,因为实际上
df1
最多可能有500万行?

请尝试使用以下方法:

library(dplyr)
library(tidyr)

out <- df1 %>%
         nest(data = -Area) %>%
         left_join(df2, by = 'Area') %>%
         group_by(Area) %>%
         summarise(data = map(data, ~.x %>% 
                                      mutate(gender = sample(gender, n(), 
                                      prob = probability, replace = TRUE)))) %>%
         distinct(Area, .keep_all = TRUE) %>%
         unnest(data)
库(dplyr)
图书馆(tidyr)
超出%
嵌套(数据=-面积)%>%
左联合(df2,由='区域')%>%
分组单位(面积)%>%
总结(数据=地图(数据,~.x%>%
突变(性别=样本(性别,n(),
prob=概率,replace=TRUE))%>%
不同(区域,.keep_all=TRUE)%>%
unnest(数据)
我们首先
nest
df1
并通过
Area
将其与
df2
连接起来。对于每个
区域
我们
采样
性别
值基于
概率
df2
unest
中获得长数据帧


df1
中没有足够的样本来验证结果,但如果我们增加
df1
中的行数,则比例应与
df2
中的
概率
相似。您还希望在采样时包括
概率
,很好的一点-我确实想以概率作为样本的基础。谢谢-看起来很有希望,但我得到了这个错误
错误:列'data'必须是长度1(摘要值),而不是2
-你知道如何修复它吗?我想你有
dplyr
<1.0.0。您能否使用
install.packages('dplyr')
Yes将其更新到最新版本?它工作正常。后续问题。有时,数据区域子集的样本概率均为NA,因为数据已被审查(实际上,这是针对普查数据)。您将如何更新这些情况下的代码以将NA分配给该区域中的所有个人?您可以使用
if
条件检查
NA
值。类似于:
.x%>%mutate(gender=if(all(is.na(probability)))na-else-sample(gender,n(),prob=probability,replace=TRUE))