【问题标题】:How do you sample groups with different sample sizes with data.table您如何使用 data.table 对具有不同样本大小的组进行抽样
【发布时间】:2015-11-03 09:48:28
【问题描述】:

我正在尝试使用 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 的新手,因此非常感谢任何建设性的指导

【问题讨论】:

  • 您的真实数据集中a 中有两个以上的组?就像如果这只是两组,你可以只做DT[a == 1, indx := 3]; DT[a != 1, indx := 5] ; DT[, .SD[sample(.N, indx)], by = a] 或使用.I 而不是.SD 优化它。

标签: r data.table


【解决方案1】:

一种选择是通过'a' 传递split 'b' 列,将'size' 作为向量传递到Map 并使用相应的'size' 获得'b' 的sample。输出为list,可以使用stack 将其转换为具有2 列的“data.frame”。

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 使用Map 得到list 输出。

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

【讨论】:

  • 你的第一个方法给出了相同大小的样本。
  • 如果任何组的样本大小为 1,请注意要小心,因为 sample.int 会起作用
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2021-01-19
  • 1970-01-01
  • 2023-02-22
  • 2016-01-10
相关资源
最近更新 更多