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) Повторная выборка 5 раз на 2 интервалах по 10 единиц (т. е. с 1:10 и 11:20) каждый интервал, выбранный 5 раз, может дать:

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


person TBP    schedule 29.11.2018    source источник
comment
Можете ли вы показать ожидаемый результат на минимальном примере?   -  person markus    schedule 29.11.2018
comment
добавлен ожидаемый пример ввода/вывода   -  person TBP    schedule 29.11.2018


Ответы (1)


Я думаю, что цикл 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) 

Уточнения и предложения по улучшению подхода, конечно, приветствуются...

person TBP    schedule 30.11.2018