根据R中的分组变量对行组重新采样

根据R中的分组变量对行组重新采样,r,random-sample,R,Random Sample,我对R比较陌生,所以如果这是一个愚蠢/明显的问题,我深表歉意!我感兴趣的是创建一个新的数据集,该数据集由从更大的数据集中重新采样并替换的行集合组成 我拥有的数据集类似于这样,每个分组变量有多行 > df <- data.frame(value=c(1:5,1:4,1:3),ID=c(rep(1,5),rep(2,4),rep(3,3))) > df value ID 1 1 1 2 2 1 3 3 1 4 4 1 5

我对R比较陌生,所以如果这是一个愚蠢/明显的问题,我深表歉意!我感兴趣的是创建一个新的数据集,该数据集由从更大的数据集中重新采样并替换的行集合组成

我拥有的数据集类似于这样,每个分组变量有多行

> df <- data.frame(value=c(1:5,1:4,1:3),ID=c(rep(1,5),rep(2,4),rep(3,3)))
> df
   value ID
1      1  1
2      2  1
3      3  1
4      4  1
5      5  1
6      1  2
7      2  2
8      3  2
9      4  2
10     1  3
11     2  3
12     3  3

谢谢你的建议

对于每个ID值采样不同数量的行,您可以尝试以下方法(假设ID值具有少量唯一值):

使用上述建议的dplyr解决方案,您还可以对每个ID值的可变样本数执行类似操作(还需要预先指定向量中每个对应ID的样本数):

库(dplyr)
nsamples%group_by(ID)%%>%slice(样本(n(),nsamples[ID],replace=TRUE))

您是否需要
df[sample(nrow(df)),]
?@RonakShah,谢谢您的建议。我需要它在对给定ID进行采样时获取所有行(即,对行块进行采样)。如果我正确理解您的问题,使用库
dplyr
和分组,您可以尝试以下操作:
df%>%group\u by(ID)%%>%slice(sample(n(),3,replace=TRUE))
。这适用于固定数量的样品。否则,您需要使用
rbind
编写一个循环。谢谢,@Gopala。如本例中所示,行数确实因分组ID而异。关于使用rbind的循环可能是什么样子的,有什么提示吗?请参见下文……三种不同的解决方案,以实现我所希望的结果。这并没有成功地实现所要求的。它对给定ID的行的随机子集进行采样。问题是如何使用替换对ID进行采样,每次都取具有该ID的所有行。
   value ID
1      1  1
2      2  1
3      3  1
4      4  1
5      5  1
6      1  3
7      2  3
8      3  3
9      1  1
10     2  1
11     3  1
12     4  1
13     5  1
result <- NULL
result <- rbind(result, df[sample(row.names(df[df$ID == 1, ]), 10, replace = TRUE), ])
result <- rbind(result, df[sample(row.names(df[df$ID == 2, ]), 5, replace = TRUE), ])
result <- rbind(result, df[sample(row.names(df[df$ID == 3, ]), 3, replace = TRUE), ])
row.names(result) <- seq(1:nrow(result))
nsamples <- c(10, 5, 3, 7, 8, 2)
result <- NULL
for (i in 1:length(nsamples)) {
  result <- rbind(result, df[sample(row.names(df[df$ID == i, ]), nsamples[i], replace = TRUE), ])
}
row.names(result) <- seq(1:nrow(result))
   value ID
1      1  1
2      4  1
3      1  1
4      4  1
5      2  1
6      3  1
7      1  1
8      1  1
9      4  1
10     2  1
11     2  2
12     3  2
13     1  2
14     3  2
15     1  2
16     3  3
17     2  3
18     1  3
library(dplyr)
nsamples <- c(10, 5, 3)
df %>% group_by(ID) %>% slice(sample(n(), nsamples[ID], replace = TRUE))