R: Подсчитать вхождения вектора y в x - PullRequest
0 голосов
/ 04 марта 2019

Предположим, у вас есть два вектора y и x с length(y) < length(x).Я хочу посчитать, как часто все элементы y появляются в x в одном и том же порядке. Могу предположить, что элементы y появляются хотя бы один раз в x в правильном порядке.

Пример:

y = c(10,20)
x = c(10,20,20,10,20)

Индексные парызначения y в x:

(1,2),(1,3),(1,5),(4,5)

, поэтому мой результат должен быть 4.

Я уже написал функцию:

countAllPositionsOfLCS <- function(y, x) {
  potIndexList <- lapply(y, function(k) {
     which(k == x)
  })

  previousIndices <- potIndexList[[1]]
  counter <- length(potIndexList[[1]])

  if (length(potIndexList) >= 2) {
    for (k in 2:length(potIndexList)) {
      newIndices <- potIndexList[[k]]
      for (i in 1:length(previousIndices)) {
        currentFittingInds <- newIndices[which(previousIndices[i] < newIndices)]
        counter <- counter + length(currentFittingInds) - 1
      }
      previousIndices <- newIndices
    }  
  }
  counter
}

Я протестировал эту функциюс

c(10,20,30) and c(10,20,20,10,20,20,30,30)

Правильный результат должен быть 12, но функция говорит 10.

Индексные пары равны 1,2,7 | 1,2,8 | 1,3,7 | 1,3,8 | 1,5,7 | 1,5,8 | 1,6,7 | 1,6,8 | 4,5,7 | 4,5,8 | 4,6,7 | 4,6,8.

Моя идея была следующей:

Прежде всего, я смотрю, где значения y появляются в x, и для каждого значения y я сохраняю индексы в списке potIndexList.затем я просматриваю все элементы этого списка, скажем, что мы находимся в элементе potIndexList[[k]], поэтому у нас есть все индексы там, где k-й элемент y соответствует оператору x.Поскольку я хочу сохранить порядок y в x, я должен избавиться от некоторых индексов.Поэтому я проверяю индексы и проверяю previousIndices[i] < potIndexList[[k]].Если это TRUE, я знаю, что порядок правильный.

1 Ответ

0 голосов
/ 04 марта 2019

Я предлагаю использовать expand.grid, если ваша настоящая проблема не связана с гораздо большими векторами:

y  = c(10,20,30)
x = c(10,20,20,10,20,20,30,30)

#find matches:
inds <- lapply(y, function(z) which(z == x))

#all combinations of matches:
res <- do.call(expand.grid, inds)

#remove combinations with wrong order:
res <- res[apply(res, 1, function(z) all(order(z) == seq_along(y))),]
#    Var1 Var2 Var3
# 1     1    2    7
# 3     1    3    7
# 5     1    5    7
# 6     4    5    7
# 7     1    6    7
# 8     4    6    7
# 9     1    2    8
#11     1    3    8
#13     1    5    8
#14     4    5    8
#15     1    6    8
#16     4    6    8

nrow(res)
#[1] 12
...