从具有嵌套结构的数据框创建随机样本

Creating a random sample from a dataframe with a nested structure

这个问题基于 SO post found here

我正在尝试使用嵌套条件在数据框中提取行的随机样本。

使用以下虚拟数据集(修改自iris):

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          5.3         2.9          1.5         0.2  setosa
5          5.2         3.7          1.3         0.2  virginica
6          4.7         3.2          1.5         0.2  virginica
7          3.9         3.1          1.4         0.2  virginica
8          4.7         3.2          1.3         0.2  virginica
9          4.0         3.1          1.5         0.2  versicolor
10         5.0         3.6          1.4         0.2  versicolor
11         4.6         3.1          1.5         0.2  versicolor
12         5.0         3.6          1.5         0.2  versicolor

下面的代码可以很好地获取 2 行的简单样本:

iris[sample(nrow(iris), 2), ]

但是,我想做的是为特定变量的每个级别抽取 2 行样本。例如,为变量 'Species' 的每个级别创建一个 2 行的随机样本,如下所示:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
4          5.3         2.9          1.5         0.2  setosa
6          4.7         3.2          1.5         0.2  virginica
7          3.9         3.1          1.4         0.2  virginica
11         4.6         3.1          1.5         0.2  versicolor
12         5.0         3.6          1.5         0.2  versicolor

感谢您的帮助!

使用 dplyr 非常简单:

library(dplyr)
iris %>%
    group_by(Species) %>%
    sample_n(size = 2)

#   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1          4.6         3.4          1.4         0.3     setosa
# 2          5.2         3.5          1.5         0.2     setosa
# 3          6.5         2.8          4.6         1.5 versicolor
# 4          5.7         2.8          4.5         1.3 versicolor
# 5          5.8         2.8          5.1         2.4  virginica
# 6          7.7         2.6          6.9         2.3  virginica

您可以根据需要按任意多的列进行分组

CO2 %>% group_by(Type, Treatment) %>% sample_n(size = 2)