我有一个庞大的数据集,其中包含有关1000个不同实体的观察结果。每个实体的ID介于1和1000之间,并且没有丢失的ID。由于数据集的行数超过100万,我想获得一个子集,每个实体有10个随机观察值进行分析。
以下代码可以解决这个问题,但它看起来很麻烦且性能很差。
library(dplyr) # sample_n is a dplyr function
samples <- sample_n(dataset[dataset$Entity == 1, ], 10)
for (x in 2:1000) {
samples <- rbind(samples, sample_n(dataset[dataset$Entity == x, ], 10))
}
请你以更好的方式分享一些想法吗?
提前致谢!
答案 0 :(得分:2)
我认为您在使用group_by
时不需要使用for循环。 library(dplyr)
dt = data.frame(mtcars)
dt %>% group_by(cyl) %>% sample_n(3)
命令用于以更有效的方式完成您对for循环的所有工作。
一个简单的例子是:
cyl
为每个cyl
值抽取3行。
因此,请考虑ID
这是您的your_dataset %>% group_by(ID) %>% sample_n(10)
。像
UITextField
将完成这项工作。
答案 1 :(得分:2)
作为@AntoniosKs的替代方案,为什么不考虑使用data.table
现在您拥有大型数据集。如果您的数据作为数据表存储在DT
中,并且您希望为每个ID
抽样10个观察值,那么
library(data.table)
DT[, .SD[sample(.N,10)], by = ID]
应该给你一个大幅度的加速。