如何";a组待定“;在R

如何";a组待定“;在R,r,dplyr,plyr,R,Dplyr,Plyr,我试图通过因子级别获取数据帧中行的引导样本。为此,我使用了ddply和sample\n。但是,我需要为sample\n设置一个size参数,因为这会返回一条错误消息: ddply (mtcars, .(carb), .fun = sample_n, replace=TRUE) 在?示例中,我阅读了大小参数,即如果tbl是分组,大小适用于每个组。我想这就是我要找的,但是我找不到关于如何对tbl参数进行分组的任何其他信息。是否尚未在ddply函数中分组 请注意,我不想对固定数量的行运行上述函数(e

我试图通过因子级别获取数据帧中行的引导样本。为此,我使用了
ddply
sample\n
。但是,我需要为
sample\n
设置一个
size
参数,因为这会返回一条错误消息:

ddply (mtcars, .(carb), .fun = sample_n, replace=TRUE)
?示例
中,我阅读了
大小
参数,即如果tbl是分组,大小适用于每个组。我想这就是我要找的,但是我找不到关于如何对
tbl
参数进行分组的任何其他信息。是否尚未在
ddply
函数中分组


请注意,我不想对固定数量的行运行上述函数(ej:
ddply(mtcars,.(carb),.fun=sample\n,size=2,replace=TRUE))
,因为它可能会根据因子的级别而变化。在这个例子中,我希望carb=2级有10个样本,carb=3级有3个样本,等等。

我们可以使用
dplyr
purrr
。在下面的代码中,我们使用
split(.$carb)
carb
拆分数据帧
map2_df
可以通过列表(
.x
,这里是拆分数据帧的列表)和向量或列表(
.y
)中的每个元素应用函数,然后返回组合数据帧
.y=c(3,3,1,3,1,1)
指定每组的采样数

set.seed(123)

library(dplyr)
library(purrr)

mtcars %>%
  split(.$carb) %>%
  map2_df(.y = c(3, 3, 1, 3, 1, 1), ~.x %>% sample_n(size = .y, replace = TRUE))

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
2  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
3  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
4  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
5  21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
6  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
7  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
8  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
9  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
10 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
11 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

我们可以使用
dplyr
purrr
。在下面的代码中,我们使用
split(.$carb)
carb
拆分数据帧
map2_df
可以通过列表(
.x
,这里是拆分数据帧的列表)和向量或列表(
.y
)中的每个元素应用函数,然后返回组合数据帧
.y=c(3,3,1,3,1,1)
指定每组的采样数

set.seed(123)

library(dplyr)
library(purrr)

mtcars %>%
  split(.$carb) %>%
  map2_df(.y = c(3, 3, 1, 3, 1, 1), ~.x %>% sample_n(size = .y, replace = TRUE))

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
2  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
3  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
4  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
5  21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
6  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
7  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
8  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
9  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
10 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
11 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

有没有一种方法可以通过“小组”获得与该小组观察结果相同数量的样本?@EuGENE请查看我的更新。我想我找到了一种方法。为什么不使用
map_-df(~.x%>%sample_-n(size=nrow(.x),replace=TRUE))
而不是map2_-df()`来获得与组中观察值数量相匹配的样本呢?@NateDay感谢分享这个好的解决方案。在最初的帖子中,OP指出,对于carb=2级,有10个样本,对于carb=3级,有3个样本,所以我假设OP可能想要定义每组的样本量。我想这就是为什么我提出了
map2_-df
解决方案。但是,如果OP希望样本大小与行号完全相同,那么您的解决方案会更好,因为OP不需要再次指定样本大小。啊哈,我错过了问题中关于每组大小的规定。。。我刚才在看下面的评论。有没有办法按“组”获得和该组观察结果一样多的样本?@EuGENE请查看我的更新。我想我找到了一种方法。为什么不使用
map_-df(~.x%>%sample_-n(size=nrow(.x),replace=TRUE))
而不是map2_-df()`来获得与组中观察值数量相匹配的样本呢?@NateDay感谢分享这个好的解决方案。在最初的帖子中,OP指出,对于carb=2级,有10个样本,对于carb=3级,有3个样本,所以我假设OP可能想要定义每组的样本量。我想这就是为什么我提出了
map2_-df
解决方案。但是,如果OP希望样本大小与行号完全相同,那么您的解决方案会更好,因为OP不需要再次指定样本大小。啊哈,我错过了问题中关于每组大小的规定。。。我只是在看下面的评论。