gpt4 book ai didi

r - dplyr sample_n 其中 n 是分组变量的值

转载 作者:行者123 更新时间:2023-12-04 05:27:06 27 4
gpt4 key购买 nike

我有以下分组数据框,我想使用函数 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]
Groups: GLB, NDG

Gene GLB NDG
1 A4GNT 3 1
2 ABTB1 3 1
3 AHSG 3 1
4 A4GNT 3 2
5 ABTB1 3 2
6 AHSG 3 2
7 AADAC 10 1
8 ABHD14B 10 1
9 ACVR2B 10 1
10 AADAC 10 2
11 ABHD14B 10 2
12 ACVR2B 10 2

例如,假设正确的随机选择,我想要的代码
> dg %>% dplyr::sample_n(NDG)

输出:
Source: local data frame [6 x 3]
Groups: GLB, NDG

Gene GLB NDG
1 A4GNT 3 1
2 A4GNT 3 2
3 ABTB1 3 2
4 AADAC 10 1
5 AADAC 10 2
6 ABHD14B 10 2

但是,它给出了以下错误:
Error in eval(expr, envir, enclos) : object 'NDG' not found

相比之下, dplyr::slice当我使用代码时给出正确的输出
> dg %>% dplyr::slice(1:unique(NDG))

使用 unique 有点hackish然而,在这种情况下,代码
> dg %>% dplyr::slice(1:NDG)

返回以下警告消息
Warning messages:
1: In slice_impl(.data, dots) :
numerical expression has 3 elements: only the first used
2: In slice_impl(.data, dots) :
numerical expression has 3 elements: only the first used
3: In slice_impl(.data, dots) :
numerical expression has 3 elements: only the first used
4: In slice_impl(.data, dots) :
numerical expression has 3 elements: only the first used

显然是因为 NDG正在评估(在适当的环境中)为 c(1,1,1)c(2,2,2) ,因此 1:NDG返回上述警告。

关于为什么我得到错误,我知道哈德利用于方法 sample_n.grouped_df 的代码是
sample_n.grouped_df <- function(tbl, size, replace = FALSE, weight = NULL,
.env = parent.frame()) {

assert_that(is.numeric(size), length(size) == 1, size >= 0)
weight <- substitute(weight)

index <- attr(tbl, "indices")
sampled <- lapply(index, sample_group, frac = FALSE,
tbl = tbl, size = size, replace = replace, weight = weight, .env = .env)
idx <- unlist(sampled) + 1

grouped_df(tbl[idx, , drop = FALSE], vars = groups(tbl))
}

可以在相关的 Github page 上找到。 .因此我得到错误,因为 sample_n.grouped_df找不到变量 NGD因为它没有在正确的环境中寻找。

因此,是否有使用 sample_n 的巧妙方法?在 dg获得
Source: local data frame [6 x 3]
Groups: GLB, NDG

Gene GLB NDG
1 A4GNT 3 1
2 A4GNT 3 2
3 ABTB1 3 2
4 AADAC 10 1
5 AADAC 10 2
6 ABHD14B 10 2

通过对每组使用随机抽样?

最佳答案

一个可能的答案,但我不相信这是最佳答案:用 dplyr::sample_frac 置换数据帧的行(和 1 的一小部分),然后切片所需的行数:

> set.seed(1)
> dg %>%
dplyr::sample_frac(1) %>%
dplyr::slice(1:unique(NDG))

这给出了正确的输出。
Source: local data frame [6 x 3]
Groups: GLB, NDG

Gene GLB NDG
1 A4GNT 3 1
2 AHSG 3 2
3 A4GNT 3 2
4 ACVR2B 10 1
5 AADAC 10 2
6 ACVR2B 10 2

而且我想我可以在必要时编写一个函数来在一行中执行此操作。

关于r - dplyr sample_n 其中 n 是分组变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30950016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com