R中嵌套组中的重采样
我曾遇到过类似的问题,但未能找到满足我具体需求的答案 我有一个嵌套组设计的数据集,我需要在每个组内随机采样(替换),重采样事件的数量必须等于每个组的采样数(即行)。此外,嵌套组具有多个数据列。请参见下面的示例R中嵌套组中的重采样,r,R,我曾遇到过类似的问题,但未能找到满足我具体需求的答案 我有一个嵌套组设计的数据集,我需要在每个组内随机采样(替换),重采样事件的数量必须等于每个组的采样数(即行)。此外,嵌套组具有多个数据列。请参见下面的示例df 我有使用dplyr包的代码,但我正在远离dplyr,因为我必须在dplyr更改函数名和操作时不断更新我的代码……至少可以说这很烦人。是的……我知道有几种方法可以避免这个问题,但我决定现在是时候抛开dplyr拐杖,学习如何使用Rbase包执行数据争用 工作dplyr代码: Resampl
df
我有使用dplyr
包的代码,但我正在远离dplyr
,因为我必须在dplyr
更改函数名和操作时不断更新我的代码……至少可以说这很烦人。是的……我知道有几种方法可以避免这个问题,但我决定现在是时候抛开dplyr
拐杖,学习如何使用Rbase
包执行数据争用
工作dplyr代码:
Resample_function = function(Boot)
{group_by(data1, GROUP, YEAR) %>%
slice(sample(n(), replace = TRUE))%>%
ungroup()
}
我曾尝试使用各种组合的aggregate
、ave
和apply
函数系列……但我处理base
包中嵌套组设计的能力至少是有限的
下面我提供了一个示例数据集(df)以及结果应该是什么样子。请注意,重采样产品将产生不同的结果,但每个嵌套组的重采样数应相同
最后一个请求…我对所有选项(例如,库(data.table)、库(boot)等)都持开放态度,因为如果其他人觉得这篇文章有用,那就太好了。此外,其中一些包可能比base
package更高效。但是,我更喜欢不需要安装和加载额外软件包的解决方案
提前谢谢你的帮助
保重
df <- read.table(text = "GROUP YEAR VAR1 VAR2
a 2018 1.0 1.0
a 2018 2.0 2.0
b 2018 10 10
b 2018 20 20
b 2018 30 30
b 2018 40 40
b 2019 50 50
b 2019 60 60
b 2019 70 70
b 2019 80 80
b 2019 90 90
b 2019 100 100
b 2019 110 110
b 2019 120 120
b 2019 130 130
b 2019 140 140
b 2019 150 150
b 2019 160 160
b 2019 170 170
b 2019 180 180
b 2020 190 190
b 2020 200 200
b 2020 210 210", header = TRUE)
result <- read.table(text = "GROUP YEAR VAR1 VAR2
a 2018 1 1
a 2018 1 1
b 2018 20 20
b 2018 30 30
b 2018 30 30
b 2018 20 20
b 2019 70 70
b 2019 170 170
b 2019 50 50
b 2019 150 150
b 2019 70 70
b 2019 150 150
b 2019 100 100
b 2019 120 120
b 2019 50 50
b 2019 160 160
b 2019 90 90
b 2019 150 150
b 2019 170 170
b 2019 180 180
b 2020 190 190
b 2020 190 190
b 2020 190 190", header = TRUE)
df您可以使用ave
在基本R中执行这种洗牌:
Resample_function <- function(data) {
new_data <- data[with(data, ave(seq(nrow(data)), GROUP, YEAR,
FUN = function(x) sample(x, replace = TRUE))), ]
rownames(new_data) <- NULL
return(new_data)
}
Resample_function(df)
重采样功能谢谢@Ronak_Shah!我不得不对FUN
进行一个小的修改,因为我没有在示例数据集中包含一个重要的细节。我的一些嵌套组只有一个样本…这使得重采样毫无意义,但我希望按原样分析数据。这引发了一条激烈的信息:“要替换的项目数量不是替换长度的倍数”。下面是修改:FUN=function(x)x[sample.int(length(x),replace=TRUE)]