根据值进行滚动应用

时间:2018-11-29 19:17:28

标签: r apply rollapply

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

似乎rollapply是实现此目的的方法,但是似乎不能说服根据数据值定义其滚动窗口吗?

例如:

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

这样做非常有用,它可以获取数字列表并每20个数字重新采样一次,但是,我希望它从最低值开始并在常规值箱中重新采样。对于上面的示例,(左边缘)箱可定义为:

(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个间隔(即从1:10和11:20开始)重新采样5次,每个间隔采样5次会产生:

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

1 个答案:

答案 0 :(得分:0)

我猜想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) 

改进方法的精益求精当然值得赞赏...