gpt4 book ai didi

r - 匹配向量内的向量

转载 作者:行者123 更新时间:2023-12-04 14:38:36 25 4
gpt4 key购买 nike

我有:

vec1 <- c(0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1)
vec2 <- c(1, 1)

我预计:
magicFUN(x = vec1, y = vec2)
[1] 4 7 8

这意味着我想要一个完整向量在另一个向量中的位置。 matchis.element没有用,因为它们返回 vec2 的每个元素的位置我需要那个 magicFUN匹配完整的 vec2进入 vec1 .

最佳答案

一个通用的解决方案:

magicFUN <- function(vec1, vec2) {
if(length(vec2) > length(vec1)) stop("vec 2 should be shorter")
len <- length(vec1) - length(vec2) + 1
out <- vector(mode = "logical", length=len)
for(i in 1:len) {
out[i] <- identical(vec2, vec1[i:(i+length(vec2)-1)])
}
return(which(out))
}

vec1 <- c(0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1)
vec2 <- c(1, 1)

magicFUN(vec1, vec2)

[1] 4 7 8

for 循环将是最快的解决方案(除了使用 Rcpp)。请参阅以下基准:
magicFUN <- function(vec1, vec2) {
if(length(vec2) > length(vec1)) stop("vec 2 should be shorter")
len <- length(vec1) - length(vec2) + 1
out <- vector(mode = "logical", length=len)
for(i in 1:len) {
out[i] <- identical(vec2, vec1[i:(i+length(vec2)-1)])
}
return(which(out))
}

magicFUN2 <- function(vec1, vec2){
l1 <- length(vec1)
l2 <- length(vec2)
which(colSums(sapply(1:(l1-l2), function(i) vec1[i:(i+l2-1)]) == vec2) == l2)
}

magicFUN3 <- function(vec1, vec2){
which(c(zoo::rollapply(vec1, width=length(vec2),
function(x)all(x==vec2), align = "left"),rep(FALSE,length(vec2)-1))==TRUE)
}

library(microbenchmark)
microbenchmark(magicFUN(vec1, vec2), magicFUN2(vec1, vec2), magicFUN3(vec1, vec2))

Unit: milliseconds
expr min lq mean median uq max neval cld
magicFUN(vec1, vec2) 6.083572 6.575844 7.292443 6.878016 7.421208 13.35746 100 a
magicFUN2(vec1, vec2) 8.289640 8.976736 11.007967 9.338644 9.951492 139.68886 100 a
magicFUN3(vec1, vec2) 39.131268 42.369479 46.303722 44.203563 45.053252 172.46151 100 b

关于r - 匹配向量内的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com