基于值滚动应用
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)
改进方法的改进和建议当然值得赞赏...
我想对一个大型数据集重新采样,该数据集在数据范围内具有不相等数量的观察值,以便每个范围具有相等数量的观察值。
似乎 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)
改进方法的改进和建议当然值得赞赏...