我要对数据范围内的观测数不等的大数据集进行重采样,以便每个范围都有相同数量的观测值。
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、3、5、6、7、11、13、13、20)范围内观测值分布不均匀的输入向量,每间隔10次(即从1:10和11:20)重放5次,可产生:
c( 3、1、7、3、2、11、20、11、13、20)
发布于 2018-11-30 15:56:22
我想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) 改进方法的改进和建议当然值得赞赏.
https://stackoverflow.com/questions/53546080
复制相似问题