Ответ 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
(Спасибо Джошу за исправление ниже)
Как бы вы использовали 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
Может быть, что-то вроде этого?
> 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
(Спасибо Джошу за исправление ниже)
Я считаю, что ответ 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
Вдохновленный этим ответом Дэвидом Аренбургом, другим способом избежать выделения .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
ему соответствует.
Стратифицированная выборка > избыточная выборка
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)]