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

R 在保持原始数据分布比例的同时选择随机行?,r,data.table,R,Data.table,假设我有以下数据 d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201) 现在,我如何选择一个小样本,比如说10行(或10%的数据),它基于一个或多个列具有大致相似的组分布。因此,对于上表,我可以得到的假设子集如下: group x y a 8 108 b 32 132 e 93 193 b 46 146

假设我有以下数据

d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201)
现在,我如何选择一个小样本,比如说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中如何实现这一点?有一个关于的问题讨论了这一点,但我不想手动计算分布百分比。

您可以按组对索引/行数
进行采样。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]
,然后从每组中取一定比例的行号,用索引将原始数据.table子集(未命名列默认为
V1
)提供您需要的。

我认为您应该使用插入符号。
createDataPartition()
函数用于子集数据集,而不会丢失目标变量的概率分布

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

d[sample(.N),head(.SD,.N*.1),by=group]
(把所有行都混在一起,然后选择top)。@Frank Nice one。谢谢Psidom和Frank!感谢@Frank也修复了问题格式。非常感谢,非常好!感谢Damiano指出了
caret::createDataPartition
,并给出了完整的答案。
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")