将两个矩阵(一个和两个)匹配在一起并提取匹配矩阵二的索引的快速方法是什么?矩阵二很大(数百到数千行)。用另一个矩阵对矩阵索引进行子集化
one
[,1] [,2]
9 11
13 2
head(two)
[,1][,2]
[1,] 9 11
[2,] 11 9
[3,] 2 3
[4,] 13 2
[5,] 2 4
[6,] 3 3
输出应为(注意指数2怎么不是一个输出值),这样做的
1 4
将两个矩阵(一个和两个)匹配在一起并提取匹配矩阵二的索引的快速方法是什么?矩阵二很大(数百到数千行)。用另一个矩阵对矩阵索引进行子集化
one
[,1] [,2]
9 11
13 2
head(two)
[,1][,2]
[1,] 9 11
[2,] 11 9
[3,] 2 3
[4,] 13 2
[5,] 2 4
[6,] 3 3
输出应为(注意指数2怎么不是一个输出值),这样做的
1 4
你可以写一个C++循环做到这一点相当快
library(Rcpp)
cppFunction('NumericVector matrixIndex(NumericMatrix m1, NumericMatrix m2){
int m1Rows = m1.nrow();
int m2Rows = m2.nrow();
NumericVector out;
for (int i = 0; i < m1Rows; i++){
for (int j = 0; j < m2Rows; j++){
if(m1(i, 0) == m2(j, 0) && m1(i, 1) == m2(j, 1)){
//out[j] = (j+1);
out.push_back(j + 1);
}
}
}
return out;
}')
matrixIndex(m1, m2)
[1] 1 4
虽然我怀疑这会更快先预分配结果向量,东西像
cppFunction('NumericVector matrixIndex(NumericMatrix m1, NumericMatrix m2){
int m1Rows = m1.nrow();
int m2Rows = m2.nrow();
NumericVector out(m2Rows);
for (int i = 0; i < m1Rows; i++){
for (int j = 0; j < m2Rows; j++){
if(m1(i, 0) == m2(j, 0) && m1(i, 1) == m2(j, 1)){
out[j] = (j+1);
//out.push_back(j + 1);
}
}
}
return out;
}')
matrixIndex(m1, m2)
[1] 1 0 0 4 0 0
## 0 == nomatch.
方式一:
a = apply(one, 1, paste0, collapse = "-")
b = apply(two, 1, paste0, collapse = "-")
match(a, b)
#[1] 1 4
我们所有的列粘贴在一起,按行明智的两个矩阵,然后匹配它们以获得相同的行。
仅供参考,
a
#[1] "9-11" "13-2"
b
#[1] "9-11" "11-9" "2-3" "13-2" "2-4" "3-3"
你不会说“快”你的意思是计算时间或人的时间。如果只需要进行一次,那么如果优化人员时间,总体时间可能会最短,并且Ronak的答案将很难被击败,这是清晰而强大的。
如果数字都小于某个数字(例如,如您的示例数据中的100),则可以执行类似的操作,但使用算术将两列组合在一起,然后进行匹配。我怀疑(但没有测试过),这将比转换为字符向量更快。当然,其他算术选项也取决于你的情况。
a <- one[,1]*100 + one[,2]
b <- two[,1]*100 + two[,2]
match(a, b)
我们可以使用%in%
which(do.call(paste, as.data.frame(two)) %in% do.call(paste, as.data.frame(one)))
#[1] 1 4
快速计算机或为程序员?如果你只需要做一次,那么成千上万的行并不是那么多。 – Aaron
可能的重复https://stackoverflow.com/questions/12463687/subset-a-matrix-by-values-in-the-other-matrix – akrun