根据R中的分组变量对行组重新采样
我对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
> 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))