如何从给定因子的大数据框中获取代表性样本

问题描述 投票:0回答:3

如果一列是一个因素,但数据框的每个子集具有不同的大小 - 也许一个子集有数千行,而另一个子集有数万或数十万行 - 使用

df[sample(nrow(df, n),]
完成的采样可能不会有对于特定子集来说有足够的行。

采样的数据框将转换为 ggplot2 中的抖动图,我希望每个方面具有大致相同的样本大小。

r sampling
3个回答
0
投票

在基数 R 中,您正在寻找函数

by
ply
中的 -
package:plyr
函数将完成类似的工作。它们更强大、更灵活,但使用起来有点棘手,如果您已经非常熟悉基本的 -
apply
功能,通常不需要它们。

有一条皱纹。运行类似

by(iris,iris$Species,function(d) sample(nrow(d)))
或其等效的
plyr
dlply(iris,.(Species),function(d) sample(nrow(d)))
将为您提供按物种划分的每个子数据帧的样本...但它将相对于该子数据帧进行索引,并且不是全部。如果您正确设计了数据结构,这应该不是问题。记住这一点并相应地编写你的绘图脚本。我可能会创建类似数据框列表的东西,我可以方便地迭代它来绘制每个方面,但没有人指责我是一个优秀的程序员。


0
投票

ddply(iris, .(Species), function(d) { d[sample(nrow(d), pmin(nrow(d), 2000)),] })

它将数据框按 
Species

因子分开,获取每个子集的样本,然后将其重新组合到数据框中。


我使用

pmin(nrow(d), 2000)

来避免出现

cannot take a sample larger than the population
消息。

在这种情况下,

iris

不是最好的例子,它只包含 150 行,每个物种只有 50 行 - 但同样的逻辑也用于我原来的 160 万行数据框,其中一个子集少于 2000 行.

    


0
投票
分层样本

,您可以使用dplyr包中的group_bysample_n set.seed(0) strat_iris <- iris %>% group_by(Species) %>% sample_n(5)

在此示例中,您将获得一个 15 行数据集样本,每个因子有 5 行。

© www.soinside.com 2019 - 2024. All rights reserved.