【问题标题】:Use of apply instead of loops for a matrix对矩阵使用 apply 而不是循环
【发布时间】:2016-01-15 22:57:28
【问题描述】:

我有一个包含 150 列和 100.000 行的矩阵 (all_parameters)。该矩阵中每个数据元素的值为“1”。现在,如果满足以下条件,我想将这些值替换为“0”:

列名 10, 14, 27 行名以“T1_”开头

我有以下工作正常的循环:

T1_missing = c(10,14,27)

for(i in 1:ncol(all_parameters)) {
  if (any(T1_missing == as.integer(colnames(all_parameters)[i]))) { 
    for(j in 1:nrow(all_parameters)) {
      if(grepl("^T1_", rownames(all_parameters)[j])) {
        all_parameters[j,i] <- 0
      }
    }
  }
}

问题在于循环的执行需要非常长的时间。我已经尝试使用 apply 功能,但是我无法使其工作。谁能告诉我如何使用 apply 函数(或其他任何比 for 循环更好更快的方法)来解决这个问题。

感谢您的帮助!

【问题讨论】:

  • 我不确定我是否理解正确,但你为什么要遍历所有列?当然,您可以选择有问题的三列,然后检查这三列的行吗?
  • 是的,我确实可以只检查那三行。但是,我也想在其他条件下执行此代码,我还需要检查其他行(然后通常只检查三行以上)。

标签: r for-loop apply


【解决方案1】:

这只是一个简单的矢量化操作吗:

all_parameters[ grepl("^T1_", rownames(all_parameters) ), T1_missing] <- 0 

行上的其他条件将添加&amp;(这可能会使条件更具限制性)或|(包括更多行)。 我假设您使用术语“col names”实际上是指通过它们的数字位置来引用它们。使用[ i, j]-operations,您可以将 i 行中的逻辑索引与 j 列中的数字索引混合。 (现在用 jbaums 的例子进行了测试:自从他删除后,现在在这里转载:

m <- matrix(1, ncol=30, nrow=12, 
        dimnames=list(paste0('T', rep(1:3, each=4), '_', rep(1:4, 3)),
                      1:30))

【讨论】:

    【解决方案2】:

    不用apply也可以:

    df <- data.frame(`10` = rnorm(3), `7` = head(letters,3), `14` = rnorm(3), 
                     check.names = FALSE, row.names = c('T1_A', 'ABC', 'T1_B'))
    
    ##             10 7          14
    ##T1_A -1.8234804 a  1.31575373
    ##ABC  -0.4232959 b  0.01400561
    ##T1_B -1.1252495 c -0.32442049
    
    rows.to.change <- grepl('T1_', rownames(df))
    
    cols.missing <- c(10, 14, 27)
    cols.to.change <- as.integer(colnames(df)) %in% cols.missing
    
    df[rows.to.change, cols.to.change] <- 0
    ##             10 7         14
    ##T1_A  0.0000000 a 0.00000000
    ##ABC  -0.4232959 b 0.01400561
    ##T1_B  0.0000000 c 0.00000000
    

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 2021-01-08
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多