对矩阵使用应用而不是循环

Use of apply instead of loops for a matrix

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

col name 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 循环更好更快的函数)来解决这个问题。

感谢您的帮助!

不用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

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

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

行的更多条件将添加 &(这可能会使条件更具限制性)或 |(以包含更多行)。 我假设您使用术语 "col names" 实际上是指通过它们的数字位置来引用它们。使用 [ i, j] 操作,您可以将 i-rows 中的逻辑索引与 j-columns 中的数字索引混合。 (现在用 jbaums 的示例进行了测试:自从他删除后现在在此处复制:

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