gpt4 book ai didi

r - 具有不等大小组的高效递归随机抽样

转载 作者:行者123 更新时间:2023-12-05 05:48:02 26 4
gpt4 key购买 nike

这个问题是我之前关于递归随机抽样问题的后续问题 Efficient recursive random sampling .当组大小相同或每组需要固定数量的样本时,该线程中的解决方案工作正常。但是,让我们想象一个数据集如下;

   ID1 ID2
1 A 1
2 A 6
3 B 1
4 B 2
5 B 3
6 C 4
7 C 5
8 C 6
9 D 6
10 D 7
11 D 8
12 D 9

我们希望为每个 ID1 随机抽样 最多 n ID2,并以递归方式进行抽样。 递归 这里意味着我们从第一个 ID1 移动到最后一个 ID1,如果 ID2 已经为 ID1 采样,那么它不应该用于后续ID1。假设n = 2,则预期结果如下;

ID1 ID2
1 A 1
2 A 6
4 B 2
5 B 3
6 C 4
7 C 5
11 D 8
12 D 9
  • 对于ID1 = "A",恰好有两个可能的ID2,所以都被选中。
  • 对于 ID1 = "B",还有两个潜在的 ID2 可供选择,因此两个都被选中。
  • 对于 ID1 = "C",还有两个潜在的 ID2 可供选择,因此两个都被选中。
  • 对于 ID =“D”,还有三个潜在的 ID2 可供采样,因此从中随机选择两个。

在示例中显示的情况之外还会发生什么;

  • 每个 ID1 总是有一个非零数量的 ID2 可用,但是,有可能所有这些 ID2 都已被使用。在在这种情况下,ID1 应该简单地排除在外。
  • ID1 可能没有 ID2 的指定 n。在那里面情况下,应检索最接近指定 n 的 n。
  • ID 不必是 seq(ID1)
  • ID2 也可以是类似于 ID1 的字符向量。

样本 df;

df <- structure(list(ID1 = c("A", "A", "B", "B", "B", "C", "C", "C", 
"D", "D", "D", "D"), ID2 = c(1, 6, 1, 2, 3, 4, 5, 6, 6, 7, 8,
9)), class = "data.frame", row.names = c(NA, -12L))

最佳答案

以下功能似乎可以满足您的需求。基本上,它循环遍历每一组 ID1 并选择相应的 ID2 尚未被采样的行。然后它选择不同的行(在某些 ID1 组具有重复的 ID2 值的情况下。样本大小将是 n 中的最小值>,或该组的行数。

sample <- function(df, n) {
`%notin%` <- Negate(`%in%`)
groups <- unique(df$ID1)
out <- data.frame(ID1 = character(), ID2 = character())

for (group in groups) {
options <- df %>%
filter(ID1 == group,
ID2 %notin% out$ID2)

chosen <- sample_n(options,
size = min(n, nrow(options))) %>%
distinct()

out <- rbind(out, chosen)
}

out
}

set.seed(123)
sample(df, 2)

ID1 ID2
1 A 1
2 A 6
3 B 2
4 B 3
5 C 4
6 C 5
7 D 8
8 D 9

当一组 ID1 中有 ID2 已经用完的情况:输入:

# A tibble: 10 × 2
ID1 ID2
<chr> <dbl>
1 A 1
2 A 3
3 B 1
4 B 3
5 C 5
6 C 6
7 C 7
8 C 7
9 D 10
10 D 20

输出:

sample(df2, 2)
# A tibble: 6 × 2
ID1 ID2
<chr> <dbl>
1 A 3
2 A 1
3 C 6
4 C 7
5 D 20
6 D 10

关于r - 具有不等大小组的高效递归随机抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70882770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com