gpt4 book ai didi

r - 自定义分组 dplyr 函数 (sample_n)

转载 作者:行者123 更新时间:2023-12-01 12:06:57 29 4
gpt4 key购买 nike

我试图以分组的方式将采样函数应用于数据框,如果组大小小于 n,它应该从每个组或所有组成员中采样 n 个样本。

使用dplyr,我第一次尝试

library(dplyr)
mtcars %>% group_by(cyl) %>% sample_n(2)

这在 n 小于所有组大小时有效,但当我选择 n 大于组大小时不占用整个组(请注意,其中一个 cyl 组中有 7 辆车):
mtcars %>% group_by(cyl) %>% sample_n(8)
Error: `size` must be less or equal than 7 (size of data),
set `replace` = TRUE to use sampling with replacement

我试图通过创建一个适应的 group_n 函数来解决这个问题,如下所示:
sample_n_or_all <- function(tbl, n) {
if (nrow(tbl) < n)return(tbl)
sample_n(tbl, n)
}

但是使用我的自定义函数( mtcars %>% group_by(cyl) %>% sample_n_or_all(8) )会产生相同的错误。

我有什么建议可以调整我的功能,以便我可以将其应用于每个组?或者问题的另一种解决方案?

最佳答案

我们可以检查组中的行数并将值传递给 sample_n因此。

library(dplyr)
n <- 8

temp <- mtcars %>% group_by(cyl) %>% sample_n(if(n() < n) n() else n)
temp

# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21.4 4 121 109 4.11 2.78 18.6 1 1 4 2
# 2 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
# 3 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
# 4 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
# 5 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
# 6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
# 7 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
# 8 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
# 9 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#10 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
# … with 13 more rows

之后我们可以检查每组中的行数。
table(temp$cyl)

#4 6 8
#8 7 8

table(mtcars$cyl)

# 4 6 8
#11 7 14

关于r - 自定义分组 dplyr 函数 (sample_n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55676368/

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