我想对数据范围内观察值不相等的大型数据集重新采样,以使每个范围都具有相等数量的观察值。
似乎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)
答案 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)
改进方法的精益求精当然值得赞赏...