这个问题是我之前关于递归随机抽样问题的后续问题高效的递归随机采样 https://stackoverflow.com/questions/69824065/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
我们想要随机采样的地方up to n每个 ID1 对应 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。
- 身份证号码不一定是
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))