如果一列是一个因素,但数据框的每个子集具有不同的大小 - 也许一个子集有数千行,而另一个子集有数万或数十万行 - 使用
df[sample(nrow(df, n),]
完成的采样可能不会有对于特定子集来说有足够的行。
采样的数据框将转换为 ggplot2 中的抖动图,我希望每个方面具有大致相同的样本大小。
在基数 R 中,您正在寻找函数
by
。 ply
中的 -package:plyr
函数将完成类似的工作。它们更强大、更灵活,但使用起来有点棘手,如果您已经非常熟悉基本的 -apply
功能,通常不需要它们。
有一条皱纹。运行类似
by(iris,iris$Species,function(d) sample(nrow(d)))
或其等效的 plyr
dlply(iris,.(Species),function(d) sample(nrow(d)))
将为您提供按物种划分的每个子数据帧的样本...但它将相对于该子数据帧进行索引,并且不是全部。如果您正确设计了数据结构,这应该不是问题。记住这一点并相应地编写你的绘图脚本。我可能会创建类似数据框列表的东西,我可以方便地迭代它来绘制每个方面,但没有人指责我是一个优秀的程序员。
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 行.
,您可以使用dplyr包中的group_by和sample_n:
set.seed(0)
strat_iris <- iris %>%
group_by(Species) %>%
sample_n(5)
在此示例中,您将获得一个 15 行数据集样本,每个因子有 5 行。