从数据集中创建随机样本的可能方式,通过子集选择进行dput处理。

4
由于我的评论触发了一些反应,我阅读了(非常有用的)帖子,其中介绍了如何创建可重现的示例,我认为这个问题可能与此非常相关。
我注意到有时候用户(越来越多)在这里询问解决方案,但是介绍总是相同的“我有一个非常大的数据集…”,因此他们没有展示任何代码。
所以我想知道是否有一种方法可以创建数据的小样本,但不是仅使用head(<data>, n),因为通常(实际上大多数情况下)有一些因素等对于问题的目的非常重要,并且为了成功,提供的示例数据集必须具有原始数据中不同因素的(即使只有)几行。这导致经典的dput(head(data))无用。
浏览时,我在这里找到了一个好的解决方案,现在我将在这里写下它之前的问题

有没有其他方法来做到这一点(当然有)?更有效率的方法?或者更“稳定”,即保证所有因素的存在?

以下是我找到的解决方案:

 set.seed(123)
 samp_dat <- iris[ sample(1:nrow(iris), 10, replace = F ), ]
 samp_dat
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
44           5.0         3.5          1.6         0.6     setosa
118          7.7         3.8          6.7         2.2  virginica
61           5.0         2.0          3.5         1.0 versicolor
130          7.2         3.0          5.8         1.6  virginica
138          6.4         3.1          5.5         1.8  virginica
7            4.6         3.4          1.4         0.3     setosa
77           6.8         2.8          4.8         1.4 versicolor
128          6.1         3.0          4.9         1.8  virginica
79           6.0         2.9          4.5         1.5 versicolor
65           5.6         2.9          3.6         1.3 versicolor

编辑

目前提供的解决方案非常好(我已经点赞了它们),当然我感谢发布者,但请考虑以下:目的是创建原始数据集的简单示例,因此我邀请大家尽可能发布简单的解决方案,因为请求帮助的用户可能对R没有深入的了解,所以我认为应避免冗长的解决方案并避免使用外部包(即使我不得不承认dplyr的解决方案非常简单[当然需要一些dplyr的知识])。


欢迎评论以改进我的问题。如果您认为它太广泛,请投票关闭,但至少请评论有关如何使问题不那么广泛的见解和提示。 - SabDeM
2个回答

2
如果你只想维护每个因素的视图,可能最简单的方法就是使用 dplyr 并采样特定数量。例如:
iris %>% group_by(Species) %>% sample_n(3)

尽管从实际角度考虑,您可能希望像caret的创建数据分割或其他具有更复杂抽样方法的软件包一样进行分层抽样。

1
这里有几个选项可以确保采样所有因素组合。
## Factor columns
cols <- sapply(iris, class) == "factor"

## Using dplyr
library(dplyr)
iris %>% group_by(interaction(iris[, cols])) %>%
  sample_n(2) -> output

## Base R
do.call(rbind, lapply(split(iris, interaction(iris[, cols])), function(group)
    group[sample(nrow(group), 2),]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接