矢量化R中不同长度的矢量的逻辑比较的for循环

时间:2017-12-06 16:37:38

标签: r performance for-loop vector comparison

R中,不能有意义地比较不同长度的载体,即

x = 1:10
y = 7:12
x >= y

发出警告,y短于x。我想对xy的每个元素进行比较,并保存或转换结果向量,如

v = numeric()
for(i in 1:length(x)){
  v[i] = sum( x[i] >= y )
}

此操作很慢 - 是否有直接的方式来到这里?另外,sum考虑将i保存在矩阵v[i,]的行中。

1 个答案:

答案 0 :(得分:2)

我们可以使用outerrowSums

执行此操作
rowSums(outer(x, y, FUN= '>='))
#[1] 0 0 0 0 0 0 1 2 3 4

或另一个选项是使用sapply循环,然后获取逻辑矩阵的colSums

colSums(sapply(x, '>=', y))
#[1] 0 0 0 0 0 0 1 2 3 4

我们还可以翻译for

中的Rcpp循环
#include <Rcpp.h>

using namespace Rcpp;
using namespace std;

//[[Rcpp::export]]

NumericVector getSum(NumericVector v1, NumericVector v2) {
    NumericVector v(v1.size());

    for(int i = 0; i <= v1.size(); i++) {
        v[i] = sum(v1[i] >= v2 );


    }
    return(v);



}

- 来自R控制台

library(Rcpp)
sourceCpp("rcppTrial.cpp")
getSum(x, y)
 #[1] 0 0 0 0 0 0 1 2 3 4