r - 如何在 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)
解决方案
根据您的描述,也许您可以replicate
在您的sample_from_lookup
, 即
sample_from_lookup <- function(number){
amount <- replicate(number,
sample(lookup$amount,
1,
replace = FALSE,
prob = lookup$pdf))
}
在这种情况下,您需要为1
您的sample
函数设置大小。
推荐阅读
- kubernetes - 即使命名空间被删除,CRD 也不会被删除
- c# - 将对象参数从 cshtml 视图传递到 ASP.net 核心中的控制器
- python - Conda(基本)环境是否应该保持最新?
- firebase - 有没有办法在颤动中从 Firestore 加载图像?
- c# - 如何将入队数据的实时计数呈现到我的视图中
- c# - 如何在 WPF C# 中将按钮文本对齐到中心?
- linux - 如何获得蓝牙配对和发现状态
- javascript - Material-UI AppBar Buttons 页面刷新时跳转到屏幕中心
- html - 打印布局在 Firefox 中有效,但在 Chrome 中无效
- python - 关键字不能是表达式 - 查看