首页 > 解决方案 > 如何在 R 中的组内进行抽样而不进行替换

问题描述

我有一个数据框,其中包含一个“年份”变量,其值在 1 到 100000 之间重复多次。我有另一个数据框,其中包含 1000 个“损失金额”,以及每个损失的相关概率。我想通过从损失金额表中抽样将损失金额合并到年份数据帧中。我想在年度变量的每个级别内进行抽样而不进行替换,例如,在年度变量的每个级别内,损失金额应该是唯一的。

下面的可重现示例,我只能在整个“年份”数据集中而不是根据需要在年份变量的不同级别内对其进行采样而不进行替换。有没有办法做到这一点(理想情况下不使用循环,因为我需要代码快速运行)

#mean frequency
freq <- 100
years <- 100000

#create data frame with number of losses in each year
num_losses <- rpois(years, freq)
year <- tibble(index=1:length(num_losses), num=num_losses)
year <- map2(year$index, year$num, function(x, y) rep(x, y)) %>% unlist() %>% tibble(year = .)

#lookup table with loss amounts
lookup <- tibble(prob = runif(1000, 0, 1), amount = rgamma(1000, shape = 1.688, scale = 700000)) %>%
  mutate(total_prob = cumsum(prob)/sum(prob),
         pdf = total_prob - lag(total_prob),
         pdf = ifelse(is.na(pdf), total_prob, pdf))


#add on amounts to year table by sampling from lookup table
sample_from_lookup <- function(number){
  amount <- sample(lookup$amount, number, replace = FALSE, prob = lookup$pdf) 
}

amounts <- sample_from_lookup(nrow(year))
year <- tibble(year = year$year, amount = amounts)

标签: rdplyr

解决方案


根据您的描述,也许您可​​以replicate在您的sample_from_lookup, 即

sample_from_lookup <- function(number){
  amount <- replicate(number,
                      sample(lookup$amount, 
                             1, 
                             replace = FALSE, 
                             prob = lookup$pdf))
}

在这种情况下,您需要为1您的sample函数设置大小。


推荐阅读