使用矢量化从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