Подтвердить что ты не робот

Пример случайных строк в каждой группе в таблице данных.

Как бы вы использовали data.table, чтобы эффективно брать образец строк в каждой группе в фрейме данных?

DT = data.table(a = sample(1:2), b = sample(1:1000,20))
DT
    a   b
 1: 2 562
 2: 1 183
 3: 2 180
 4: 1 874
 5: 2 533
 6: 1  21
 7: 2  57
 8: 1  20
 9: 2  39
10: 1 948
11: 2 799
12: 1 893
13: 2 993
14: 1  69
15: 2 906
16: 1 347
17: 2 969
18: 1 130
19: 2 118
20: 1 732

Я думал о чем-то вроде DT[ , sample(??, 3), by = a], который возвращал бы образец из трех строк для каждого "a" (порядок возвращаемых строк не значителен):

    a   b
 1: 2 180
 2: 2  57
 3: 2 799
 4: 1  69
 5: 1 347
 6: 1 732
4b9b3361

Ответ 1

Может быть, что-то вроде этого?

> DT[,.SD[sample(.N, min(3,.N))],by = a]
   a   b
1: 1 744
2: 1 497
3: 1 167
4: 2 888
5: 2 950
6: 2 343

(Спасибо Джошу за исправление ниже)

Ответ 2

Я считаю, что ответ joran может быть далее обобщен. Подробности здесь (Как вы отбираете группы в таблице данных с предостережением), но я считаю, что это решение учитывает случаи, когда нет "3" строк от образца.

Текущее решение будет выходить из строя, когда оно пытается отбирать "x" раз из строк, которые имеют меньше общих значений "x". В приведенном ниже случае х = 3. И это учитывает это предостережение. (Решение, сделанное nrussell)

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

Ответ 3

Вдохновленный этим ответом Дэвидом Аренбургом, другим способом избежать выделения .SD было бы выборка групп, а затем соединение с исходными данными с помощью .EACHI

DT[ DT[, sample(.N, 3), by=a], b[i.V1], on="a", by=.EACHI]

#    a  V1
# 1: 2  42
# 2: 2 498
# 3: 2 179
# 4: 1 469
# 5: 1  93
# 6: 1 898

где строка DT[, sample(.N, 3), by=a] дает нам образец для каждой группы

#         a V1
# 1:      1  9
# 2:      1  3
# 3:      1  2
# 4:      2  4
# 5:      2  9
# ---          

поэтому мы можем использовать V1, чтобы дать нам b ему соответствует.

Ответ 4

Стратифицированная выборка > избыточная выборка

size=don[y==1,.(strata=length(iden)),by=.(y,x)] # count of iden by strata   
table(don$x,don$y) 

don<-merge(don,size[,.(y,strata)],by="x") #merge strata values  
don_strata=don[,.SD[sample(.N,strata)],by=.(y,x)]