Создание сводного отчета из матрицы в R с использованием векторизации

Я хочу создать сводную таблицу из матрицы. В сводной таблице первый столбец имеет интервалы, а последующие столбцы заполняются частотами на основе определенных условий и ширины интервалов. Мне удалось сделать это с помощью цикла for, который проходит по каждой строке сводной таблицы. Однако мне было интересно, есть ли способ сделать это без цикла for или функции apply, потому что матрица имеет большое количество строк.

Например, «модель» имеет матрицу, которую я хочу суммировать в таблице «выход».

n <- 1000
set.seed(12)
model <- matrix(0,nrow = n, ncol = 3)
model[,1] <- rbinom(n,1,0.6)
model[,2] <- runif(n,0,120)
model[,3] <- runif(n,70,110)

# Creating summary table of model
output <- matrix(0,13,3)

output[,1] <- seq(from = 0, to = 120, by=10)
for (i in 1:length(output[,1])){
  output[i,2] <- sum(model[,2]>=10*(i-1) & model[,2]<10*i & model[,1]==1 & model[,3]<=100)
  output[i,3] <- sum(model[,2]>=10*(i-1) & model[,2]<10*i & model[,1]==0 & model[,3]<=100)
}
head(output)

Результат будет:

> head(output)
     [,1] [,2] [,3]
[1,]    0   33   22
[2,]   10   41   26
[3,]   20   28   23
[4,]   30   41   30
[5,]   40   41   25
[6,]   50   43   23

Благодарю вас!


person Praveen Kumar    schedule 02.01.2021    source источник


Ответы (1)


Вы уже векторизуете строки model, поэтому цикл по output, вероятно, не займет много времени. Просто для сравнения вот подход с использованием sapply:

i <- seq(from = 0, to = 120, by = 10)
results <- function(i) {
    cbind(sum(model[, 2] >= i & model[, 2] < (i + 10) & model[, 1] == 1 & model[, 3] <= 100),
    sum(model[, 2] >= i & model[, 2] < (i + 10) & model[, 1] == 0 & model[, 3] <= 100))
}
output <- unname(cbind(i, t(sapply(i, results))))
head(output)
#      [,1] [,2] [,3]
# [1,]    0   33   22
# [2,]   10   41   26
# [3,]   20   28   23
# [4,]   30   41   30
# [5,]   40   41   25
# [6,]   50   43   23
person dcarlson    schedule 02.01.2021
comment
Большое спасибо. Время выполнения не является проблемой для одной итерации модели, но оно значительно увеличилось, когда ширина корзины была уменьшена. Кроме того, мне приходится запускать эту модель большое количество раз (до 100 000), поэтому мне было интересно, возможна ли дальнейшая векторизация для сокращения общего времени выполнения. - person Praveen Kumar; 03.01.2021