2015-10-29 2 views
0

Я пытаюсь найти позиции строки последовательности. Под этим я подразумеваю следующее:Как вернуть индекс строки в R?

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

[Соответствующий] (http://stackoverflow.com/questions/33027611/how-to-index-a-vector-sequence-within-a-vector-sequence/33044729#33044729) – Tensibai

+0

@PierreLafortune Я очень unsure, цель связана, но не идентична (возвращает длину совпадений, а не индексы). – Tensibai

+0

Маркировка как обман. Ответ Ричарда ниже должен работать на вас. Если эффективность является проблемой, любой ответ на цель обмана должен делать то же самое, что и Ричард при завершении, например, 'lapply (find_pat (x, y), function (s) seq (from = s, length.out = length (х))) ' – Frank

ответ

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

Может быть немного запутанным, но стоит того, чтобы отметить только в случае:

m <- regexpr(paste0(x,collapse=""),paste0(z,collapse = ""),fixed=T) 
seq(m,length.out=length(x)) 

Идея заключается в том, чтобы превратить каждый вектор в текстовой строке, а затем обнаружил, где первая строка в секунду.

Позиция матча дает начальную позицию, длина первого вектора дает количество индексов, которые мы должны вернуть.

Минусом он сломается со значениями выше 9.

Edit, чтобы объяснить, почему это может произойти сбой:

> 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 

Это соответствует две позиции, но это не должно совпадать.

Смежные вопросы