从这些问题 - Random sample of rows from subset of an R dataframe&Sample random rows in dataframe我可以很容易地看到如何从df或'n'行中随机采样(选择)'n'行,这些行来自df中特定级别的因子 .
以下是一些示例数据:
df <- data.frame(matrix(rnorm(80), nrow=40))
df$color <- rep(c("blue", "red", "yellow", "pink"), each=10)
df[sample(nrow(df), 3), ] #samples 3 random rows from df, without replacement.
例如,只需从'pink'颜色中抽取3个随机行 - 使用 library(kimisc)
:
library(kimisc)
sample.rows(subset(df, color == "pink"), 3)
或编写自定义功能:
sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE]
sample.df(subset(df, color == "pink"), 3)
但是,我想从每个级别的因子中抽取3(或n)个随机行 . 即新的df将有12行(蓝色3个,红色3个,黄色3个,粉红色3个) . 显然可以多次运行,为每种颜色创建newdf,然后将它们绑定在一起,但我正在寻找一种更简单的解决方案 .
5 回答
您可以使用
ave
为具有特定因子级别的每个元素分配随机ID . 然后,您可以选择特定范围内的所有随机ID .这样做的好处是可以保留原始行顺序和行名称,如果这是您感兴趣的话 . 另外,您可以相当容易地重复使用
rndid
向量来创建不同长度的子集 .在
dplyr
0.3及更高版本中,这可以正常工作:旧版本的dplyr(版本<= 0.2)
我开始使用 dplyr 来回答这个问题,假设这会起作用:
但事实证明,在0.2中存在
sample_n.grouped_df
S3方法,但从未派遣过't registered in the NAMESPACE file, so it' . 相反,我必须这样做:据推测,这将在未来的更新中修复 .
我会考虑my stratified function,目前作为GitHub Gist托管 .
得到它:
并使用它:
有几种不同的功能便于分层采样 . 例如,您也可以采取样品“即时” .
为了让您了解函数的作用,以下是
stratified
的参数:df
:输入data.frame
group
:构成"strata"的一列或多列的字符向量 .size
:所需的样本量 .如果
size
是小于1的值,则从每个层中取出一个比例样本 .如果
size
是1或更大的单个整数,则从每个层中获取该样本数 .如果
size
是整数向量,则为每个层获取指定数量的样本 . 建议您使用命名向量 . 例如,如果您有两个层,"A"和"B",并且您想要"A"中的5个样本和"B"中的10个样本,则应输入size = c(A = 5, B = 10)
.select
:这允许您在采样过程中对组进行子集化 . 这是list
. 例如,如果您的group
变量是"Group",并且它包含三个层,"A","B"和"C",但您只想从"A"和"C"进行采样,则可以使用select = list(Group = c("A", "C"))
.replace
:用于替换采样 .这是一个解决方案 . 我们将data.frame拆分为颜色组 . 从每个这样的组中,我们采样3行 . 结果,我们获得了data.frames列表 .
然后data.frames列表应合并为1 data.frame:
这是一种基础方式,允许多个组和替换采样:
要添加另一个组,请将其包含在“by”参数中以进行聚合 .