我有两个非常长的向量:

a <- sample(1e+08L, size = 1e+09L, replace = TRUE)
b <- sample(1e+08L, size = 1e+09L, replace = TRUE)

我想生成一个长度为length(a)的整数向量r,这样r[i]就是ba[i]的索引.

我试了pmatch(a, b),但速度太慢了.有没有更有效的方法?


以下是一个小示例所需的输出:

a <- c(1, 3, 5, 7, 8)
b <- c(3, 1, 7, 8, 5)
f(a, b)
## [1] 2 1 5 3 4

推荐答案

一种方法是使用Rcpp包,并在Rcpp内执行自定义pmatch函数,即

library(Rcpp)
library(microbenchmark)

cppFunction('
  IntegerVector cpp_pmatch(const NumericVector& b, const NumericVector& a) {
    IntegerVector result(b.size());
    
    for (int i = 0; i < b.size(); ++i) {
      double b_value = b[i];
      bool found = false;

      for (int j = 0; j < a.size(); ++j) {
        double a_value = a[j];

        if (a_value == b_value || (int)a_value == (int)b_value) {
          result[i] = j + 1;
          found = true;
          break;
        }
      }

      if (!found) {
        result[i] = NA_INTEGER;
      }
    }
    
    return result;
  }
')

这将产生以下结果:

cpp_pmatch(a, b)
[1] 2 1 5 3 4
pmatch(a, b)
[1] 2 1 5 3 4

Benchmark:

benchmark_result <- microbenchmark(
      cpp_pmatch = cpp_pmatch(a, b),
      pmatch = pmatch(a, b),
      times = 1000L
    )

> Unit: nanoseconds
       expr  min   lq   mean median   uq   max neval
 cpp_pmatch  900 1000 1166.4   1000 1100 14500  1000
     pmatch 7400 7500 8229.5   7600 7800 40400  1000

R相关问答推荐

R gtsummary tBL_summary,包含分层和两个独立分组变量

R -模运算后的加法

在ubuntu 22.04上更新到R4.4后包安装出现编译错误

如何在弹性表中为类别值的背景上色

从R中的另一个包扩展S3类的正确方法是什么

单击 map 后,将坐标复制到剪贴板

保存包含循环和ifelse的函数的输出

次级y轴R gggplot2

如何在R中合并和合并多个rabrame?

如何使用按钮切换轨迹?

R根据条件进行累积更改

如何改变x轴比例的列在面

用关联字符串替换列名的元素

如何通过ggplot2添加短轴和删除长轴?

悬崖三角洲超大型群数计算导致整数溢出

将多个变量组合成宽格式

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

隐藏基于 case 总数的值

通过不完全重叠的多个柱连接