我正在尝试查找序列的行位置。我的意思是:
x<-c(-1,1)
y<-c(1,-1,1,0,-1,0,0)
match(x,y)
[1] 2 1
为什么不返回2 3? (这就是我想要的)
如果我这样做:
y<-c(0,-1,1,0,-1,0,0)
match(x,y)
[1] 2 3
它有效。建议?
答案 0 :(得分:5)
这是一个想法。 imatch()
会找到所有匹配的索引,以防有多个匹配项。它通过检查两个连续索引,一次一对,并检查它们是否与x
向量相同来完成此操作。删除不匹配,并返回匹配列表。
imatch <- function(x, y) {
Filter(
Negate(is.null),
lapply(seq_along(length(y)-1), function(i) {
ind <- i:(i+1)
if(identical(y[ind], x)) ind
})
)
}
imatch(c(-1, 1), c(1, -1, 1, 0, -1, 0, 0))
# [[1]]
# [1] 2 3
imatch(c(-1, 1), c(1, -1, 1, 0, -1, 1, 0))
# [[1]]
# [1] 2 3
#
# [[2]]
# [1] 5 6
答案 1 :(得分:1)
可能有点令人费解,但值得注意的是:
> x2 <- c(3,4)
> y2 <- c(1,34,5)
> m <- regexpr(paste0(x2,collapse=""),paste0(y2,collapse = ""),fixed=T)
> seq(m,length.out=length(x))
[1] 2 3
我们的想法是在文本字符串中转换每个向量,然后找到第一个字符串在第二个字符串中的位置。
匹配位置给出起始位置,第一个向量的长度给出我们应该返回多少指数。
缺点它会突破9以上的值。
编辑以解释它可能失败的原因:
{{1}}
匹配两个位置,但不应该匹配。