У меня есть 8 x n матрица, например
set.seed(12345)
m <- matrix(sample(1:50, 800, replace=T), ncol=8)
head(m)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 37 15 30 3 4 11 35 31
[2,] 44 31 45 30 24 39 1 18
[3,] 39 49 7 36 14 43 26 24
[4,] 45 31 26 33 12 47 37 15
[5,] 23 27 34 29 30 34 17 4
[6,] 9 46 39 34 8 43 42 37
Я хотел бы найти определенный шаблон в матрице, например, я хотел бы знать, где я могу найти 37, а затем в следующей строке 10 и 29, а строка после 42
Это происходит, например, в строках 57:59 указанной выше матрицы
m[57:59,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] *37 35 1 30 47 9 12 39
[2,] 5 22 *10 *29 13 5 17 36
[3,] 22 43 6 2 27 35 *42 50
A (возможно, неэффективное) решение состоит в том, чтобы получить все строки, содержащие 37 с
sapply(1:nrow(m), function(x){37 %in% m[x,]})
И затем используйте несколько циклов для проверки других условий.
Как я могу написать эффективную функцию для этого, которая может быть обобщена на любой заданный пользователем шаблон (не обязательно более трех строк с возможными "дырами" с переменным количеством значений в каждой строке и т.д.).
ИЗМЕНИТЬ: ответить на различные комментарии
- Мне нужно найти EXACT-шаблон
- Порядок в той же строке не имеет значения (если в каждой строке можно упорядочить более простые значения)
- Строки должны быть смежными.
- Я хочу получить (начальную) позицию всего возвращенного шаблона (т.е. если шаблон присутствует несколько раз в матрице, я хочу несколько возвращаемых значений).
- Пользователь вводит шаблон через графический интерфейс, мне еще предстоит решить, как это сделать. Например, для поиска вышеуказанного шаблона он может написать что-то вроде
37;10,29;42
Где ;
представляет новую строку, а ,
разделяет значения в одной строке.
Аналогично мы можем искать
50,51;;75;80,81
Значение 50 и 51 в строке n, 75 в строке n + 2 и 80 и 81 в строке n + 3