我正在寻找一种 * 高效 * 的方法,来匹配向量y
中向量x
的所有值,而不仅仅是match()
返回的第一个位置。我所追求的本质上是pmatch()
的默认行为,但没有部分匹配:
x <- c(3L, 1L, 2L, 3L, 3L, 2L)
y <- c(3L, 3L, 3L, 3L, 1L, 3L)
预期输出:
pmatch(x, y)
[1] 1 5 NA 2 3 NA
一种方法是使用ave()
,但是随着组数量的增加,这会变得很慢并且内存效率很低:
ave(x, x, FUN = \(v) which(y == v[1])[1:length(v)])
[1] 1 5 NA 2 3 NA
有人能推荐一种有效的方法来实现这一点,最好(但不是强制性的)基于R?
用于基准测试的更大数据集:
set.seed(5)
x <- sample(5e3, 1e5, replace = TRUE)
y <- sample(x, replace = TRUE)
5条答案
按热度按时间6bc51xsx1#
split
的变体。或修改:
RCPP版本可能如下所示:
基准
结果
在这种情况下,C++版本是最快的,分配的内存量最少。在使用 base 的情况下,splitB变体是最快的,rmatch分配的内存量最少。
dddzy1tm2#
需要指出的是,您可以使用
match + make.unique
来完成相同的任务。速度方面,它可能比data.table方法慢:uelo1irk3#
使用
data.table
连接,灵感来自this Q&A。检查行为
较大向量上的时序:
zvms9eto4#
如果您有一些多余的内存,您可以通过对值进行排序来加速该过程,基本上可以执行两个指针遍历来匹配数据。这是我们的实验结果
我测试了一些其他基地的R选项张贴在这里
看到它似乎表现不错
这些都返回相同的值向量。
bwitn5fc5#
您可以简单地运行
match
+paste
+ave