从for循环申请加速R

ron*_*ley 1 r

我正在运行一个带有两个矩阵的for循环.一个matrix(A)有~100个字符串(例如,name1,name2,...,name100),只有一列.另一个比值和字符串的行和列matrix(B)更大A.在B矩阵的某些地方,矩阵的每个名称A都是匹配的.我想A在输出矩阵上用特定的矩阵字符串提取和堆叠匹配的整行.

所以,我运行如下,

output <- NULL
for(K in 1:nrow(A)){
  print(K)
  for(cc in 1:nrow(B)){
    for(dd in 1:ncol(B)){
      if(toupper(A[K])==toupper(B[cc,dd])){
        output <- rbind(output,B[cc,])
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它太慢了.在运行时间方面,如何使循环更有效?

42-*_*42- 5

速度问题不是因为for循环.apply可能会更慢.您需要预先标注目标对象并使用索引分配值.

或者您需要考虑像Manuel的测试用例那样的矢量化解决方案:

 idx <- unique(which(toupper(as.matrix(B)) %in% toupper(A), arr.ind=TRUE) %% NROW(B))
 idx[idx==0] <- 4
     B[idx , ]
  z1         z2 z3
1  a  1.5623285  a
4  c -1.2196311  f
2  g  0.2551535  b
Run Code Online (Sandbox Code Playgroud)