如何使用data.table对具有不同样本大小的组进行采样

时间:2015-11-03 09:48:29

标签: r data.table

我正在尝试使用data.table加速对相对较大的数据集进行一些计算。下面的例子复制了这种情况:

DT = data.table(a=sample(1:2), b=sample(1:1000,20))
> DT
   a   b
1:  2 440
2:  1   5
3:  2 795
4:  1 138
5:  2 941
6:  1 929
7:  2 759
8:  1 192
9:  2 994
10: 1 176
11: 2 152
12: 1 893
13: 2  28
14: 1 884
15: 2 467
16: 1 761
17: 2 879
18: 1 964
19: 2 802
20: 1 271

我想对不同数量的重复组a == 1和a == 2进行抽样,例如,n1 = 5和n2 = 3次重复,无需替换,并获得类似

的内容
 a   b
1: 2 440
2: 2 879
3: 2 994
4: 2 152
5: 2 879
6: 1 884
7: 1 964
8: 1 929

但我似乎无法使用data.table解决它,即我无法将不同的样本大小插入到data.table命令中。有什么办法吗?我是data.table和R的新手,所以任何建设性的指导都会非常值得赞赏

1 个答案:

答案 0 :(得分:0)

一个选项是split' b'列' a',传递'尺寸'作为Map中的向量,并获得' b'的sample使用相应的'尺寸'。输出为list,可以将其转换为“数据框架”。使用stack包含2列。

set.seed(24)
stack(Map(sample, split(DT$b, DT$a), size=c(5,3),MoreArgs=list(replace=FALSE)))
#  values ind
#1    279   1
#2     93   1
#3    665   1
#4    797   1
#5    317   1
#6    542   2
#7    761   2
#8    893   2

或者使用data.table方法,我们melt list我们使用Map获得的输出。{/ p>

set.seed(24)
DT[, melt(Map(sample, split(b, a), size=c(5,3), MoreArgs=list(replace=FALSE)))]
#  value L1
#1   279  1
#2    93  1
#3   665  1
#4   797  1
#5   317  1
#6   542  2
#7   761  2
#8   893  2