Проверка последовательностей в векторе R - PullRequest
2 голосов
/ 05 мая 2020

Я ищу такую ​​функцию или операцию, что если у меня есть

A <- c(1, 2, 3, 4, 5)

и B <- c(1, 2, 3)

и C <- c(2, 1)

Я бы получил ИСТИНА при проверке того, содержит ли A B, и ЛОЖЬ при проверке того, содержит ли A C

в основном, эквивалент оператора% in%, но на самом деле это касается порядка элементов

В идеальном мире я бы смог сделать это без какого-либо оператора apply, но, возможно, мне придется

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Возможно, вы можете определить пользовательскую функцию subseq_check, как показано ниже

subseq_check <- function(x,y) grepl(toString(y),toString(x),fixed = TRUE)

, которая дает

> subseq_check(A,B)
[1] TRUE

> subseq_check(A,C)
[1] FALSE

Жесткий подход

subseq_find <- function(x,y) {
  inds <- which(x == head(y,1))
  if (length(inds)==0) return(FALSE)
  any(sapply(inds, function(k) all(x[k:(k+length(y)-1)]==y)))
}

такое, что

> subseq_find(A,B)
[1] TRUE

> subseq_find(A,C)
[1] FALSE
2 голосов
/ 05 мая 2020

Что ж, если разрешено использовать вид apply l oop, тогда это может сработать:

"%seq_in%" = function(b,a) any(sapply(1:(length(a)-length(b)+1),function(i) all(a[i:(i+length(b)-1)]==b))) 

(отредактировано благодаря поиску ошибок Джоном Коулманом!)

РЕДАКТИРОВАТЬ 2: Я не мог устоять перед попыткой решить и случай «несмежных»:

# find_subseq() returns positions within vec of ordered elements of x, or stops with NA upon failing
find_subseq = function(x,vec) {
    p=match(x[1],vec)
    if(is.na(p)||length(x)==1){ p } 
    else { c(p,p+find_subseq(x[-1],vec[-seq_len(p)])) }
}
"%seq_somewhere_in%" = function(b,a) all(!is.na(find_subseq(b,a)))

Примеры:

1:3 %seq_in% 1:10
[1] TRUE
c(3,1,2) %seq_in% 1:10
[1] FALSE
c(1,2,3) %seq_in% c(3,2,1,2,3)
[1] TRUE
2:1 %seq_in% c(1,2,1)
[1] TRUE
1:3 %seq_somewhere_in% c(1,10,10,2,10,10,10,3,10)
[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...