从组中抽样,但 n 在 R 中每组不同
Sample from groups, but n varies per group in R
我正在尝试随机抽样 n 次给定的分组变量,但 n 因组而异。例如:
library(dplyr)
iris <- iris %>% mutate(len_bin=cut(Sepal.Length,seq(0,8,by=1))
我有这些因素,它们是我的分组变量:
table(iris$len_bin)
(4,5] (5,6] (6,7] (7,8]
32 57 49 12
有没有办法只随机抽取这些组 n 次,n 是每个元素出现在这个向量中的次数:
x <- c("(4,5]","(5,6]","(5,6]","(5,6]","(6,7]")
结果应如下所示:
# Groups: len_bin [4]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species len_bin
<dbl> <dbl> <dbl> <dbl> <fct> <fct>
1 5 2 3.5 1 versicolor (4,5]
2 5.3 3.7 1.5 0.2 setosa (5,6]
2 5.3 3.7 1.5 0.2 setosa (5,6]
2 5.3 3.7 1.5 0.2 setosa (5,6]
3 6.5 3 5.8 2.2 virginica (6,7]
我设法使用 for 循环并使用基于向量的 sample_n() 来做到这一点。我假设必须有更快的方法。例如,我可以在 sample_n() 中定义 n 吗?
在基础 R 中你可以这样做:
iris <- iris %>% mutate(len_bin = cut(Sepal.Length, seq(4, 8, by = 1))
x <- c("(4,5]","(5,6]","(5,6]","(5,6]","(6,7]")
l <- mapply(\(x, y) x[sample(nrow(x), y), ],
split(iris, iris$len_bin),
c(table(factor(x, levels = levels(iris$len_bin)))),
SIMPLIFY = F)
do.call(rbind.data.frame, l)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species len_bin
#(4,5] 5.0 3.2 1.2 0.2 setosa (4,5]
#(5,6].17 5.4 3.9 1.3 0.4 setosa (5,6]
#(5,6].63 6.0 2.2 4.0 1.0 versicolor (5,6]
#(5,6].97 5.7 2.9 4.2 1.3 versicolor (5,6]
#(6,7] 6.9 3.1 5.1 2.3 virginica (6,7]
我正在尝试随机抽样 n 次给定的分组变量,但 n 因组而异。例如:
library(dplyr)
iris <- iris %>% mutate(len_bin=cut(Sepal.Length,seq(0,8,by=1))
我有这些因素,它们是我的分组变量:
table(iris$len_bin)
(4,5] (5,6] (6,7] (7,8]
32 57 49 12
有没有办法只随机抽取这些组 n 次,n 是每个元素出现在这个向量中的次数:
x <- c("(4,5]","(5,6]","(5,6]","(5,6]","(6,7]")
结果应如下所示:
# Groups: len_bin [4]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species len_bin
<dbl> <dbl> <dbl> <dbl> <fct> <fct>
1 5 2 3.5 1 versicolor (4,5]
2 5.3 3.7 1.5 0.2 setosa (5,6]
2 5.3 3.7 1.5 0.2 setosa (5,6]
2 5.3 3.7 1.5 0.2 setosa (5,6]
3 6.5 3 5.8 2.2 virginica (6,7]
我设法使用 for 循环并使用基于向量的 sample_n() 来做到这一点。我假设必须有更快的方法。例如,我可以在 sample_n() 中定义 n 吗?
在基础 R 中你可以这样做:
iris <- iris %>% mutate(len_bin = cut(Sepal.Length, seq(4, 8, by = 1))
x <- c("(4,5]","(5,6]","(5,6]","(5,6]","(6,7]")
l <- mapply(\(x, y) x[sample(nrow(x), y), ],
split(iris, iris$len_bin),
c(table(factor(x, levels = levels(iris$len_bin)))),
SIMPLIFY = F)
do.call(rbind.data.frame, l)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species len_bin
#(4,5] 5.0 3.2 1.2 0.2 setosa (4,5]
#(5,6].17 5.4 3.9 1.3 0.4 setosa (5,6]
#(5,6].63 6.0 2.2 4.0 1.0 versicolor (5,6]
#(5,6].97 5.7 2.9 4.2 1.3 versicolor (5,6]
#(6,7] 6.9 3.1 5.1 2.3 virginica (6,7]