Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中嵌套组中的重采样_R - Fatal编程技术网

R中嵌套组中的重采样

R中嵌套组中的重采样,r,R,我曾遇到过类似的问题,但未能找到满足我具体需求的答案 我有一个嵌套组设计的数据集,我需要在每个组内随机采样(替换),重采样事件的数量必须等于每个组的采样数(即行)。此外,嵌套组具有多个数据列。请参见下面的示例df 我有使用dplyr包的代码,但我正在远离dplyr,因为我必须在dplyr更改函数名和操作时不断更新我的代码……至少可以说这很烦人。是的……我知道有几种方法可以避免这个问题,但我决定现在是时候抛开dplyr拐杖,学习如何使用Rbase包执行数据争用 工作dplyr代码: Resampl

我曾遇到过类似的问题,但未能找到满足我具体需求的答案

我有一个嵌套组设计的数据集,我需要在每个组内随机采样(替换),重采样事件的数量必须等于每个组的采样数(即行)。此外,嵌套组具有多个数据列。请参见下面的示例
df

我有使用
dplyr
包的代码,但我正在远离
dplyr
,因为我必须在
dplyr
更改函数名和操作时不断更新我的代码……至少可以说这很烦人。是的……我知道有几种方法可以避免这个问题,但我决定现在是时候抛开
dplyr
拐杖,学习如何使用R
base
包执行数据争用

工作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)]