在保持原始数据分布比例的同时选择随机行?

时间:2017-09-09 01:36:32

标签: r data.table

考虑我有以下data.table

d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201)

表示分配为

的5个组的数据
d[,.N,by=group]

现在,我如何选择一个小样本,让我们说10行(或10%的数据),它基本上具有基于一列或多列的类似组分布。因此,对于上表,我可以接收的假设子集类似于:

  group   x    y
   a      8  108
   b     32  132
   e     93  193
   b     46  146
   d     88  188
   c     53  153
   c     68  168
   a     19  119
   d     74  174
   a     24  124

我最好如何在data.table中执行此操作?关于SO here的问题讨论了这一点,但我不想手动计算分配百分比。

2 个答案:

答案 0 :(得分:5)

我认为你应该使用caretcreateDataPartition()函数用于对数据集进行子集化,而不会丢失目标变量的概率分布。

library(caret)
my.ids <- createDataPartition(d$group, p = 0.1)
train <- d[as.numeric(my.ids[[1]]), ]

您可以检查群体和子集中目标变量的分布情况。

par(mfrow = c(1,2))
barplot(table(d$group), main = "full dataset")
barplot(table(train$group), main = "subset")

enter image description here

答案 1 :(得分:2)

您可以按组对 index / row_number .I进行采样,然后使用它对原始数据表进行子集化:

d[d[, sample(.I, .N * 0.1), group]$V1]

#    group   x   y
# 1:     a  10 110
# 2:     a   2 102
# 3:     a  14 114
# 4:     b  45 145
# 5:     b  49 149
# 6:     c  62 162
# 7:     c  51 151
# 8:     d  84 184
# 9:     d  76 176
#10:     e 100 200

此处.I是表示全局行号的整数向量,即seq_len(nrow(d))d[, sample(.I, .N * 0.1), group],然后从每个组中获取一部分行号,将原始数据子集化。带有索引的表(未命名的列默认为V1)可以满足您的需求。