对矩阵使用apply而不是loop

时间:2016-01-15 22:57:29

标签: r for-loop apply

我有一个包含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-loop更优越,速度更快的东西)来解决这个问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在没有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 的情况下执行此操作:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");

CascadeClassifier faceDetector = new CascadeClassifier("C:\\Users\\HM\\Documents\\NetBeansProjects\\vision\\src\\lbpcascade_frontalface.xml");
Mat image = Highgui.imread("C:\\Users\\HM\\Downloads\\john-lennon.jpg");

MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);

System.out.println(String.format("Faces detected: %s ", faceDetections.toArray().length));

for (Rect rect : faceDetections.toArray()) {
    Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 3);
}

String filename = "detcSuccessful.png";
Highgui.imwrite(filename, image);
    }
}

public class image {
public static void main(String[] args) {
// Load the native library.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new DetectFaceDemo().run();
    }
}

答案 1 :(得分:1)

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

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

行上的其他条件将添加&(可能会使条件更具限制性)或|(包括更多行)。 我假设你使用术语“col名称”实际上意味着通过它们的数字位置引用它们。使用[ i, j] - 操作,可以将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))