2013-05-08 5 views
0

Я видел много методов для того, чтобы получить номер или найти значение вектора или даже много значений, таких как: which(a %in% c(2,3))Найти вектор в вектор в R

Но проблема в том, что не соблюдают порядок моего вектора [2 3], я ищу вектор, но не каждый элемент отдельно.

У вас есть решение?

Благодаря

+0

Не могли бы вы пояснить, что подразумевается под «не уважать порядок»? 'which()' возвращает возвращающие знаки, которые упорядочены по определению вектора. Во-вторых, что такое 'a', скалярное значение или вектор? –

+0

привет, если бы вы могли отправить пример «a» (и, возможно, пример того, что вы хотели бы, чтобы результат выглядел), что было бы полезно при понимании вопроса –

+0

Хорошо, извините, 'a' является вектором как' образец (1: 6, 12, TRUE): [1] 3 6 6 2 3 2 6 3 5 4 5 2', и я ищу последовательность [2, 3] в 'a', но не каждые 2 и каждый 3 – EntrustName

ответ

1

Если все значения в вашем вектора одной цифры, вы можете использовать: gregexpr("23",paste0(a,collapse="")) вернуть положение 2 в каждом с (2,3) последовательности.

0

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

which(colSums(rbind(a[1:11],a[2:12]) == c(2,3)) == 2) 
0
set.seed(0) 
a <- sample(1:6,12000, TRUE) 
b <- 2:4 

vecIn <- function(a,b){ 
which(
Reduce('+', lapply(seq_along(y <- lapply(b, '==', a)), function(x){ 
              y[[x]][x:(length(a) - length(b) +x)] 
              } 
       ) 
    ) == length(b) 
    ) 
} 

> vecIn(a,b) 
[1]  2 154 986 1037 1046 1257 1266 1750 2375 2677 3184 3206 
[13] 3499 3526 3882 4238 4311 4388 4437 4580 4714 4766 4827 5046 
[25] 5279 5629 6153 6842 6856 6919 7200 7516 7520 7707 7824 7859 
[37] 8140 8191 8687 9208 9281 9313 10022 10320 10617 10720 10958 11179 
[49] 11567 11591 11698 11811 

library(zoo) 
library(rbenchmark) 

func1 <- function(a,b){ 
gregexpr(paste0(b,collapse=""),paste0(a,collapse="")) 
} 

func2 <- function(a,b){ 
which(rollapply(a, length(b), identical, b)) 
} 

func3 <- vecIn 

Некоторые тесты

benchmark(func1(a,b), func2(a,b), func3(a,b)) 
     test replications elapsed relative user.self sys.self user.child 
1 func1(a, b)   100 0.673 5.904  0.680 0.000   0 
2 func2(a, b)   100 28.808 252.702 28.198 0.672   0 
3 func3(a, b)   100 0.114 1.000  0.116 0.000   0 
    sys.child 
1   0 
2   0 
3   0 
1

grep("2|3",paste(a,collapse="|")) Я думаю, что некоторые сепараторы, как "|" может быть лучше для недоумения ситуации

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