假设我有以下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有一个问题来讨论这个问题,但是我不想手动计算分布百分比。
发布于 2017-09-09 02:10:53
我认为你应该使用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")
发布于 2017-09-09 01:48:52
您可以按组对索引/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]
,然后从每个组中取一部分行号,用索引的原始data.table子集(未命名的列默认为V1
)给出所需的内容。
https://stackoverflow.com/questions/46126394
复制相似问题