使用矢量化从R中的矩阵创建摘要报告

使用矢量化从R中的矩阵创建摘要报告,r,matrix,vectorization,summarize,R,Matrix,Vectorization,Summarize,我想从矩阵创建一个汇总表。在汇总表中,第一列有存储箱,后续列根据特定条件和存储箱的宽度填充频率。我已经使用一个遍历汇总表每一行的for循环成功地做到了这一点。但是,我想知道是否有一种方法可以在不使用for循环或apply函数的情况下执行此操作,因为矩阵有大量行 例如,“model”有一个矩阵,我想在“output”表中对其进行总结 n <- 1000 set.seed(12) model <- matrix(0,nrow = n, ncol = 3) model[,1] <-

我想从矩阵创建一个汇总表。在汇总表中,第一列有存储箱,后续列根据特定条件和存储箱的宽度填充频率。我已经使用一个遍历汇总表每一行的
for
循环成功地做到了这一点。但是,我想知道是否有一种方法可以在不使用
for
循环或
apply
函数的情况下执行此操作,因为矩阵有大量行

例如,“model”有一个矩阵,我想在“output”表中对其进行总结

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)

谢谢大家!

您已经在
model
的行中进行矢量化,因此
输出的循环可能不太耗时。为了便于比较,这里有一种使用
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

非常感谢您。对于模型的一次迭代来说,运行时间不是一个问题,但是当箱子的宽度减小时,运行时间会显著增加。另外,我必须运行这个模型很多次(最多100000次),所以我想知道进一步的矢量化是否有可能减少总的运行时间。
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