R - Повторения массива в другом массиве - PullRequest
1 голос
/ 02 июня 2011

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

Например

main <- c(A,B,C,A,B,V,A,B,C,D,E)
p <- c(A,B,C)
q <- c(A,B)

someFunction(main,p)
2

someFunction(main,q)
3

Я бездельничал с rle, но это также учитывает каждую подпункту.

Есть ли быстрое решение, которое мне не хватает?

Ответы [ 4 ]

4 голосов
/ 02 июня 2011

Вы можете использовать один из инструментов регулярных выражений в R, так как это действительно упражнение на сопоставление с образцом, в частности, gregexpr для этого вопроса.Векторы p и q представляют шаблон поиска, а main - это место, где мы хотим искать эти шаблоны.Со страницы справки для gregexpr:

gregexpr returns a list of the same length as text each element of which is of 
the same form as the return value for regexpr, except that the starting positions 
of every (disjoint) match are given. 

Таким образом, мы можем взять длину первого списка, возвращаемого gregexpr, который дает начальные позиции совпадений.Сначала мы свернем векторы, а затем выполним поиск:

someFunction <- function(haystack, needle) {
    haystack <- paste(haystack, collapse = "")
    needle <- paste(needle, collapse = "")
    out <- gregexpr(needle, haystack)
    out.length <- length(out[[1]])
    return(out.length)
}

> someFunction(main, p)
[1] 2
> someFunction(main, q)
[1] 3

Примечание - вам также нужно бросить "" вокруг вектора main, p и q векторов, если у вас нетпеременные A, B, C и др. определены.

main <- c("A","B","C","A","B","V","A","B","C","D","E")
p <- c("A","B","C")
q <- c("A","B")
3 голосов
/ 02 июня 2011

Я не уверен, что это лучший способ, но вы можете просто выполнить эту работу следующим образом:

f <- function(a,b) 
  if (length(a) > length(b)) 0 
  else all(head(b, length(a)) == a) + Recall(a, tail(b, -1))

Кто-то может найти или не найти встроенную функцию.

2 голосов
/ 02 июня 2011

Вот способ сделать это, используя embed(v,n), который возвращает матрицу всех подпоследовательностей n длины вектора v:

find_x_in_y <- function(x, y) 
                   sum( apply( embed( y, length(x)), 1, 
                                  identical, rev(x)))

> find_x_in_y(p, main)
[1] 2
> find_x_in_y(q, main)
[1] 3
2 голосов
/ 02 июня 2011

Использование sapply:

find_x_in_y <- function(x, y){
  sum(sapply(
      seq_len(length(y)-length(x)),
      function(i)as.numeric(all(y[i:(i+length(x)-1)]==x))
  ))
}


find_x_in_y(c("A", "B", "C"), main)
[1] 2

find_x_in_y(c("A", "B"), main)
[1] 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...