我有一个包含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更优越,速度更快的东西)来解决这个问题。
感谢您的帮助!
答案 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))