基于值滚动应用

rollapply based on values

我想对一个大型数据集重新采样,该数据集在数据范围内具有不相等数量的观察值,以便每个范围具有相等数量的观察值。

似乎 rollapply 会是这样做的方法,但似乎不能说服它根据数据值定义其滚动 window?

例如:

set.seed(12345)    
z <- sort(rnorm(100,100,40))
rollapply(z, 20, function(x){sample(x,20,replace=TRUE)}, by=20) 

这在获取数字列表并每 20 个数字对其进行重新采样方面做得很好,但是,我希望它从最低值开始并在常规值箱内重新采样。对于上面的示例,(左边缘)bin 可以定义为:

(0:10)*(max(z)-min(z))/10+min(z)

我知道我可以编写一个 for 循环来执行此操作,但我正在寻找一种更快/更简单的方法。

输入向量在 1:10 和 11:20 范围内的观测值分布不均: c( 1, 2, 2, 3, 3, 3, 5, 6, 7, 11, 13, 13, 20) 以 10 个单位的 2 个间隔重新采样 5 次(即从 1:10 和 11:20)每个采样 5 次的间隔可以产生:

c( 3, 1, 7, 3, 2, 11,20,11,13,20)

我想 for 循环是最简单的方法。我最终开发的解决方案是针对数据框的,但本质上与您用于简单向量的解决方案相同(如我最初问题的措辞)。

分布不均的假数据

test<-data.frame(Length=rlnorm(1000,2,1), Weight=rlnorm(1000,3,2))

重采样函数

resamplr<-function(data){
  bins<-(0:9)*(max(data$Length)-min(data$Length))/10+min(data$Length)    #define a vector representing the left edge of bins.
  step<-(max(data$Length)-min(data$Length))/10+.000001    #define the step and add a little so you don't land on any number exactly (i.e right edge)
    result<-NULL    
    for(i in 1:length(bins)){
    temp<-data[data$Length>=bins[i]&data$Length<(bins[i]+step),]   #select data range
    result<-rbind(result, temp[sample(nrow(temp), 10,replace=T), ])  #randomly sample it with replacement, and tack it onto the resampling from the previous range.
    }
return(result)
}

执行

resamplr(test) 

改进方法的改进和建议当然值得赞赏...