Разделение данных на децили и вычисление среднего значения для каждого дециля - PullRequest
2 голосов
/ 27 октября 2019

У меня есть два набора данных одинаковых размеров. Я хочу разделить каждую строку первого набора данных на децили на основе каждой строки второго набора данных, а затем вычислить среднее значение для каждого дециля. Я знаю, что могу сделать это с помощью функций заказа и циклов. Но это займет много времени.

x<-matrix(rnorm(10000),nrow = 100,ncol=100)
y<-matrix(rnorm(10000),nrow=100,ncol = 100)
m.r<-rep(0,100)
for (t in 1:100){
  y1<-y[t,]
  my_order<-order(y1,decreasing = T)
  top_10<-my_order[1:10]
  m.r[t]<-mean(x[t,top_10])
}
and so on next 10-20, 20-30 etc.

1 Ответ

1 голос
/ 27 октября 2019

Сначала можно создать матрицу y.order с ранжированием строк y.

y.order <- t(apply(y, 1, order, decreasing=TRUE))

Затем, следуя ранжированию с шагом в десять (достигается с помощью split), взять средства в каждомстрока в sapply вложенности.

res <- t(sapply(1:nrow(x), function(m) 
  sapply(split(1:100, rep(1:10, each=10)), function(n) 
    mean(x[m, y.order[m, n]]))))

Результат

head(res[,1:5])
#               1            2          3            4          5
# [1,] -0.1678216  0.102505130  0.5324668  0.344757153  0.7638530
# [2,]  0.0157764 -0.526831195 -0.3383647 -0.169914681 -0.6141832
# [3,] -0.5376350 -0.001527589 -0.2797928 -0.680547573 -0.1882390
# [4,] -0.1616552 -0.229384402  0.4574600  0.315167214 -0.1952255
# [5,] -0.0478654 -0.095276814  0.4097697 -0.003122267  0.4291888
# [6,]  0.2280566 -0.322672289 -0.5022181 -0.493842480 -0.3193979

Данные

set.seed(42)
x <- matrix(rnorm(1e4), nrow=100, ncol=100)
y <- matrix(rnorm(1e4), nrow=100, ncol=100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...