【问题标题】:Creating summary report from a matrix in R using vectorization使用矢量化从 R 中的矩阵创建摘要报告
【发布时间】:2021-04-09 01:23:12
【问题描述】:

我想从一个矩阵创建一个汇总表。在汇总表中,第一列包含 bin,随后的列根据特定条件和 bin 宽度填充频率。我已经设法使用遍历汇总表每一行的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

谢谢!

【问题讨论】:

    标签: r matrix vectorization summarize


    【解决方案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
    

    【讨论】:

    • 非常感谢。对于模型的一次迭代,运行时间不是问题,但当 bin 的宽度减小时,它会显着增加。此外,我必须多次运行此模型(最多 100,000 次),所以我想知道是否可以进一步矢量化以减少总运行时间。
    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2020-10-13
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多