我有以下分组数据框,我想使用该函数dplyr::sample_n从每个组的数据框中提取行.我想使用NDG每个组中的分组变量的值作为从每个组中提取的行数.
> dg.tmp <- structure(list(Gene = c("CAMK1", "GHRL", "TIMP4", "CAMK1", "GHRL",
"TIMP4", "ARL8B", "ARPC4", "SEC13", "ARL8B", "ARPC4", "SEC13"
), GLB = c(3, 3, 3, 3, 3, 3, 10, 10, 10, 10, 10, 10), NDG = c(1,
1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -12L), .Names = c("Gene", "GLB",
"NDG"))
> dg <- dg.tmp %>%
dplyr::group_by(GLB,NDG)
> dg
Source: local data frame [12 x 3] …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中每组包含多个样本(1-n)。我想对这个数据集进行采样,而不进行替换,以便每组最多有 5 个样本 (1-5)。
此问题之前已在此处进行过描述和解答。在这个问题中,@evolvedmicrobe的答案对我来说是最满意的,并且在过去一直有效。这种情况似乎在去年左右就被打破了。
这是我想做的一个可行的例子:
从 mtcars 中,按“cyl”分组时有不同数量的行。
table(mtcars$cyl)
4 6 8
11 7 14
Run Code Online (Sandbox Code Playgroud)
我想创建一个子样本,其中每组气缸的最大汽车数量为 10 辆。理论上,生成的行数如下所示:
table(subsample$cyl)
4 6 8
10 7 10
Run Code Online (Sandbox Code Playgroud)
我对此的天真尝试是:
library(dplyr)
subsample <- mtcars %>% group_by(cyl) %>% sample_n(10) %>% ungroup()
Run Code Online (Sandbox Code Playgroud)
但是,因为一组的行数少于 10:
错误:
size必须小于或等于 7(数据大小),设置replace= TRUE 以使用带替换的采样
@evolvedmicrobe对此的回答是创建一个自定义采样函数:
### Custom sampler function to sample min(data, sample) which can't be done with dplyr
### it's a modified copy of sample_n.grouped_df
sample_vals <- function (tbl, size, replace …Run Code Online (Sandbox Code Playgroud)