如何返回R中序列的行索引?

时间:2015-10-29 15:34:10

标签: r match

我正在尝试查找序列的行位置。我的意思是:

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

它有效。建议?

2 个答案:

答案 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}}

匹配两个位置,但不应该匹配。