从数据帧的子集进行采样,其中该子集以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))