【问题标题】:Sampling from a subset of a dataframe where the subset is conditional on a value from another dataframe in R从数据帧的子集采样,其中子集以 R 中另一个数据帧的值为条件
【发布时间】:2020-11-10 09:24:41
【问题描述】:

R 中有两个数据框。一个包含每个人和他们居住的区域的一行。例如

df1 = data.frame(Person_ID = seq(1,10,1), Area = c("A","A","A","B","B","C","D","A","D","C"))

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

例如性别df2 = data.frame(Area = c("A","A","B","B","C","C","D","D"), gender = c("M","F","M","F","M","F","M","F"), probability = c(0.4,0.6,0.55,0.45,0.6,0.4,0.5,0.5))

df1 中,我想创建一个性别列,其中对于df1 的每一行,我从df2 的适当子集中抽取一个性别。 例如,对于 df1 的第 1 行,我将从 df2 %>% filter(Area == "A") 中抽取性别

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

【问题讨论】:

  • 您还想在采样时包含probability
  • 是的,好点子 - 我确实想将样本基于概率。

标签: r dataframe dplyr


【解决方案1】:

尝试使用以下方法:

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)

我们首先 nest df1 并通过 Area 加入 df2。对于每个Area,我们samplegender 的值基于df2df2 中的probabilityunnest 以获得长数据帧。

df1 中没有足够的样本来验证结果,但是如果我们增加df1 中的行数,比例应该与df2 中的probability 相似。

【讨论】:

  • 谢谢你 - 它看起来很有希望,但我收到了这个错误Error: Column `data` must be length 1 (a summary value), not 2 - 你知道如何解决它吗?
  • 我认为你有dplyr install.packages('dplyr') 将其更新到最新版本吗
  • 是的 - 它奏效了。一个后续问题。有时,数据区域子集的样本概率全部为 NA,因为数据已被删失(实际上这是针对人口普查数据)。对于这些情况,您将如何更新您的代码以将 NA 分配给该区域的所有个人?
  • 您可以使用if 条件检查NA 值。类似:.x %&gt;% mutate(gender = if(all(is.na(probability))) NA else sample(gender, n(), prob = probability, replace = TRUE))
猜你喜欢
  • 1970-01-01
  • 2017-11-10
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多