你如何使用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[, sample(b, 3), by=a]
(除了名称)。 - GSeeDT[DT[, sample(.I, 3), by=a][[2]],]
。(sample(.I,3)
相对于DT
抽样行号)。此调用的优点是,在处理调用时不需要完全填充每个子集.SD
。 - Josh O'Brienif
语句根据a
的值有条件地更改每个组返回的样本数量:DT[,.SD[sample(.N, if(a == 1) 2 else 3)],by = a]
。 - Christopher Manning.I
上应用sample
可能会产生意外的结果。在这种情况下,.I
仅包含一个整数(DT中的行位置),而sample
的行为与提供向量时不同。如@akrun在此处所建议的solution DT[DT[ , .I[sample(.N,3)] , by = a]$V1]
可能会修复它。 - Valentin_Ștefansample(2,3)
就知道我在说什么了。)我现在已经修复了它,使用了一种修复方法,这个方法也应该被应用到你提出的解决方案中。感谢你的评论! - Josh O'Brien