你總是可以蠻力這個,只是通過元素向量元素循環。
a <- c(5,1,2,6,3,4,8)
b <- c(1,2,3)
matchr <- function(a,b){
# First, loop through the a vector
for(i in 1:(length(a)-length(b))){
pos <- FALSE
# Next loop through the b vector,
for(j in 1:length(b)){
# as we're looping through b, check if each element matches the corresponding part of the a vector we're currently at.
if(a[i+j-1] == b[j]){
pos <- TRUE
} else{
pos <- FALSE
break
}
}
# if all the elements match, return where we are in the a vector
if(pos == TRUE){
return(i)
}
}
# if we finish the a vector and never got a match, return no match.
return("No match")
}
matchr(a,b)
[1] "No match"
d <- c(7,5,4,2,1,2,3,8,5)
matchr(d,b)
[1] 5
e <- c(2,3,8)
matchr(d,e)
[1] 6
如果你真正的載體是更大的,你可以考慮通過matchr <- compiler::cmpfun(matchr)
編譯該函數或重寫RCPP它。
編輯:另一種方法
讓你a
矢量份額爲length(b)
大小的矢量的列表,然後測試是否list(b)
是在分割了a
列表:
matchr2 <- function(a){
m <- list()
for(i in 1:(length(a)-length(b))){
m[[i]] <- c(a[i : (length(b) + i - 1)])
}
m
}
mlist <- matchr2(a)
list(b) %in% mlist
[1] FALSE
mlist <- matchr2(d)
list(b) %in% mlist
[1] TRUE
同樣,你會得到通過編譯功能顯着的速度收益。
@Henrik 。感謝您找到可能的重複。我看看,可能會有所幫助。 –
@rawr感謝您指導鏈接。問題已經關閉,提供的鏈接似乎沒有關係。 'Henrik'早些時候提供的鏈接後來被刪除,效果很好。謝謝大家! –
@rawr !!。我指的是頂部的鏈接而不是鏈接。請不要刪除鏈接。 –