Сопоставьте вектор с несколькими последовательными строками в R [дубликаты]

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

Пусть col1 col1 = matrix(c(1,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,1), nrow = 21, ncol = 1) будет примером по столбцу, а вектор r r = c(2, 0 ,2) будет вектором, с которым мне нужно его сопоставить.

Мне нужно, чтобы R возвращал порядковый номер строк, где шаблон в r соответствует значениям в col1 (в данном случае строки 11, 12, 13).

Я думал, что смогу добиться этого с помощью row.match, но это не так. Я пробовал разные комбинации функций сопоставления, но это также не дает никаких результатов.

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

Спасибо.


person ayasugihada    schedule 19.11.2017    source источник
comment
Похоже, у вас проблемы с алгоритмом. Как бы вы подошли к этому на бумаге? Один из способов сделать это — преобразовать ваш столбец в строку, найти совпадение и вернуть индексы соответствия.   -  person Roman Luštrik    schedule 20.11.2017
comment
Я думаю, что это было довольно всесторонне рассмотрено здесь - Как индексировать векторную последовательность внутри векторной последовательности - find_pat(r, col1) из принятого ответа возвращает 11   -  person thelatemail    schedule 20.11.2017
comment
Спасибо за ответ, ребята. Да, пользовательская функция find_pat, кажется, решает эту проблему за меня, большое спасибо, thelatemail!   -  person ayasugihada    schedule 20.11.2017


Ответы (1)


Вы можете сделать это, используя rollapply из zoo. По сути, это работает identical на непрерывной основе с окном length(r). Это говорит вам о том, что последовательность присутствует, начиная с позиции 11 вектора col1.

library(zoo)
which(rollapply(col1,length(r),identical,r))
[1] 11

Чтобы получить вектор позиций, вы можете сделать:

which(rollapply(col1,length(r),identical,r))+0:(length(r)-1)
[1] 11 12 13
person Pierre Lapointe    schedule 19.11.2017
comment
Спасибо, Пьер, это умно и полезно. Хорошо работает с моим примером, но по какой-то причине выводит пустое целое число с моими фактическими данными. Но я думаю, что это правильный способ сделать это, и, надеюсь, я смогу решить эту проблему завтра. - person ayasugihada; 20.11.2017
comment
@ayasugihada Убедитесь, что данные одного типа typeof(col1) и typeof(r) - person Pierre Lapointe; 20.11.2017
comment
Да я думал проблема будет с колонкой, а оказалось на самом деле с вектором. Теперь работает безотказно. - person ayasugihada; 20.11.2017