首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于值的rollapply

基于值的rollapply
EN

Stack Overflow用户
提问于 2018-11-29 19:17:28
回答 1查看 155关注 0票数 1

我要对数据范围内的观测数不等的大数据集进行重采样,以便每个范围都有相同数量的观测值。

rollapply似乎就是这样做的,但是它似乎不能被说服根据数据值定义它的滚动窗口?

例如:

代码语言:javascript
复制
set.seed(12345)    
z <- sort(rnorm(100,100,40))
rollapply(z, 20, function(x){sample(x,20,replace=TRUE)}, by=20) 

这做了一个伟大的工作,采取的数字列表,并重新采样它每20个数字,然而,我希望它开始在最低的值和重采样在一个正常的垃圾箱的值。对于上面的例子,(左侧边缘)回收箱可以定义如下:

代码语言:javascript
复制
(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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-30 15:56:22

我想for循环是最简单的方法。我最终开发的解决方案是为一个数据框架,但本质上是相同的解决方案,您将使用一个简单的向量(在我的原始问题的措辞)。

分布不均的假数据:

代码语言:javascript
复制
test <- data.frame(Length=rlnorm(1000,2,1), Weight=rlnorm(1000,3,2))

定义重采样函数:

代码语言:javascript
复制
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)
}

然后使用该函数:

代码语言:javascript
复制
resamplr(test) 

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53546080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档