考虑我有以下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的问题讨论了这一点,但我不想手动计算分配百分比。
答案 0 :(得分:5)
我认为你应该使用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")
答案 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
)可以满足您的需求。