R:有没有一种干净的方法来获得循环中获得的样本的单个数据帧?

R: Is there a clean way to obtain a single Data Frame of samples obtained in a loop?

我有一个庞大的数据集,其中包含关于 1000 个不同实体的观察结果。每个实体都有一个介于 1 和 1000 之间的 ID,并且没有缺失的 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))
}

能否分享一些以更好的方式做同样事情的想法?

提前致谢!

我认为当您已经使用 dplyr 时,您不需要使用 for 循环。 group_by 命令的存在是为了以更有效的方式完成您使用 for 循环所做的所有工作。

一个简单的例子是这样的:

library(dplyr)

dt = data.frame(mtcars)

dt %>% group_by(cyl) %>% sample_n(3)

为每个 cyl 值采样 3 行。

因此,请考虑 cyl 这是您的 ID。像

your_dataset %>% group_by(ID) %>% sample_n(10)

会完成任务的。

作为@AntoniosKs 的替代答案,既然你有一个大数据集,为什么不考虑使用 data.table。如果您的数据在 DT 中存储为数据 table,并且您想为每个 ID 抽样 10 个观测值,那么

library(data.table)

DT[, .SD[sample(.N,10)], by = ID]

应该会给你很大的加速。