【问题标题】:R - efficiently loop through matrixR - 有效地循环矩阵
【发布时间】:2016-01-27 17:59:38
【问题描述】:

我有一个矩阵(名为“my_matrix”),有 150 列(列名是 1,2,3,4,5,6,7,...)和 100000 行。

我执行以下操作:

missing = c(50,57,60,77,99,101,102,109)

for(i in 1:ncol(my_matrix)) {
  if(colnames(my_matrix)[i] %in% missing) {
    for(j in 1:nrow(my_matrix)) {
        if(grepl('_old$', rownames(my_matrix)[j])){
          my_matrix[j,i] <- my_matrix[gsub("_old", "_new", rownames(my_matrix)[j]),i]
        }
    }
  }
}

这个操作很好用,基本上是看列名是否在“missing”中找到。如果是这样,它会查看行的名称是否以“_old”结尾。如果是这样,则将单元格的值替换为另一个单元格的值(例如,将第 50 列和第 237478_old 行的值替换为第 50 列和第 237478_new 行的值等等)。

不幸的是,它非常慢,需要数小时才能完成执行。有没有更快的方法来执行这个操作(例如使用 apply)?

提前致谢!

【问题讨论】:

    标签: r loops matrix apply


    【解决方案1】:

    我们创建列('j1')和行的索引(对于'新'和'旧'行名称),并使用行/列索引提取值并替换为“新的”行/列值。

     j1 <- colnames(my_matrix) %in% missing
     i1 <- grepl('_old$', rownames(my_matrix))
     i2 <- grepl('_new$', rownames(my_matrix))
     my_matrix[i1,j1] <- my_matrix(i2, j1]
    

    【讨论】:

    • 你有一些错别字; mymatrix vs my_matrix,最后一行的括号。
    • 通常情况下,对于 R 中关于“如何有效循环”的众多新手问题的正确答案是避免执行循环。
    • 只是好奇,有谁知道为什么在 4 行中执行此操作似乎比替换为 1 行更快?即使将j1 保持原样,这样它就不会被计算两次,它仍然是 4 中更快的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2021-12-31
    • 2012-02-21
    相关资源
    最近更新 更多