如何使用警告对data.table中的组进行采样

roa*_*dom 4 r data.table

这个问题非常类似于如何在data.table中对每个组中的随机行进行采样?.

差异在于一个微小的微妙之处,我没有足够的声誉来讨论这个问题本身.

让我们稍微改变一下Christopher Manning的初始数据:

> 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
Run Code Online (Sandbox Code Playgroud)

如果我们尝试了问题的解决方案:

> 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'
Run Code Online (Sandbox Code Playgroud)

这是因为列a中的值只出现一次.如果不使用替换(我们不想做),我们不能对不到三次的值进行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
Run Code Online (Sandbox Code Playgroud)

也许解决方案可能涉及sortingdata.table,然后使用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
Run Code Online (Sandbox Code Playgroud)

如果我们用n替换"3",这将返回我们应该从a = 1,a = 2,a = 3中取样的数量......我还没有找到将其纳入最终解决方案的方法.任何帮助,将不胜感激!

nru*_*ell 9

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

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
Run Code Online (Sandbox Code Playgroud)

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

仅用于演示,b以下a=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
Run Code Online (Sandbox Code Playgroud)

  • 太棒了.我完全过分思考这个问题.我整天盯着电脑屏幕可以做到这一点我猜... (2认同)