gpt4 book ai didi

r - 您如何通过警告对data.table中的组进行采样

转载 作者:行者123 更新时间:2023-12-04 23:00:21 25 4
gpt4 key购买 nike

这个问题与Sample random rows within each group in a data.table非常相似。
所不同的是,我在这个问题本身上没有足够的声誉来讨论这个问题。
让我们稍微更改一下克里斯托弗·曼宁的初始数据:

> DT = data.table(a=c(1,1,1,1:15,1,1), b=sample(1:1000,20))
> DT
a b
1: 1 102
2: 1 5
3: 1 658
4: 1 499
5: 2 632
6: 3 186
7: 4 761
8: 5 150
9: 6 423
10: 7 832
11: 8 883
12: 9 247
13: 10 894
14: 11 141
15: 12 891
16: 13 488
17: 14 101
18: 15 677
19: 1 400
20: 1 467
如果我们尝试了问题的解决方案:
> DT[,.SD[sample(.N,3)],by = a]

Error in sample.int(x, size, replace, prob) :cannot take a sample larger than the population when 'replace = FALSE'


这是因为列中的值仅出现一次。如果不使用替换(我们不希望这样做),那么我们不能对少于3次的值进行3次采样。
我正在努力应对这种情况。当出现次数> = 3时,我们要采样3次,但是如果出现次数<3,则抽取出现次数。例如,使用上面的DT,我们希望:
     a   b
1: 1 102
2: 1 5
3: 1 658
4: 2 632
5: 3 186
6: 4 761
7: 5 150
8: 6 423
9: 7 832
10: 8 883
11: 9 247
12: 10 894
13: 11 141
14: 12 891
15: 13 488
16: 14 101
17: 15 677
可能的解决方案可能是像这样对data.table进行 sorting,然后在上面的示例函数中使用 rle() lengths找出要使用的 n:
> DT <- DT[order(DT$a),]
> DT
a b
1: 1 102
2: 1 5
3: 1 658
4: 1 499
5: 1 400
6: 1 467
7: 2 632
8: 3 186
9: 4 761
10: 5 150
11: 6 423
12: 7 832
13: 8 883
14: 9 247
15: 10 894
16: 11 141
17: 12 891
18: 13 488
19: 14 101
20: 15 677

> ifelse(rle(DT$a)$lengths >= 3, 3,rle(DT$a)$lengths)
> [1] 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
如果我们将n替换为“3”,这将返回我们应从a = 1,a = 2,a = 3采样的数量...
我还没有找到一种将其纳入最终解决方案的方法。任何帮助,将不胜感激!

最佳答案

我可能会误解您的问题,但是您是否正在寻找这样的东西?

set.seed(123)
##
DT <- data.table(
a=c(1,1,1,1:15,1,1),
b=sample(1:1000,20))
##
R> DT[,.SD[sample(.N,min(.N,3))],by = a]
a b
1: 1 288
2: 1 881
3: 1 409
4: 2 937
5: 3 46
6: 4 525
7: 5 887
8: 6 548
9: 7 453
10: 8 948
11: 9 449
12: 10 670
13: 11 566
14: 12 102
15: 13 993
16: 14 243
17: 15 42

如果 b包含三个或更多值,则从 a_i绘制3个样本,如果 a_i包含三个或更多值,否则我们仅绘制 n值,其中 n( n < 3)是 a_i组的大小。

仅出于演示目的,这是我们从中采样的 ba=1的6个可能值(假设您使用与上述相同的随机种子):
R> DT[order(a)][1:6,]
a b
1: 1 288
2: 1 788
3: 1 409
4: 1 881
5: 1 323
6: 1 996

关于r - 您如何通过警告对data.table中的组进行采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325656/

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