簡體   English   中英

您如何在 data.table 中對組進行采樣並帶有警告

[英]How do you sample groups in a data.table with a caveat

這個問題與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

如果我們嘗試問題的解決方案:

> DT[,.SD[sample(.N,3)],by = a]

sample.int(x, size, replace, prob) 中的錯誤:當“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

如果a_i包含三個或更多值,我們將從ba_i組抽取 3 個樣本,否則我們只繪制n值,其中n ( n < 3 ) 是組a_i的大小。

只是為了演示,這里是我們從中采樣的a=1b的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM