Как найти последовательность чисел в массиве в R?
Я хочу найти конкретную последовательность чисел в массиве. В качестве примера предположим, что я хочу найти последовательность из двух чисел 7, т. Е. С (7,7).
Взять матрицу М, где
set.seed(100)
M = matrix(sample(10,100,replace = T), nrow = 10)
Если вы запустите код, M[5,4] и M[5,5] равны 7. Таким образом, матрица M имеет последовательность, равную той, которую я ищу.
В результате я хотел бы знать индекс строки, в которой находится последовательность, поэтому мой ответ будет 5. Чтобы сделать его еще лучше, я хотел бы знать столбец, с которого начинается последовательность. В этом случае это будет 4.
Я нашел два ответа здесь, на Stackru, связанных с этими темами. Вопрос 1 и Вопрос 2
Вопрос 1 о поиске последовательности в массиве. Я попытался связать решение, данное с apply
функционировать как в
apply(M, 1, *solution from Question 1*)
но это не сработало.
Вопрос 2, кажется, делает то, что я хочу, но он в HPH, и я не полностью понял код.
Для этого я использую R. Спасибо за отзыв.
1 ответ
Порядок элементов в матрице или массиве является "главным по столбцу", поэтому вам нужно будет проверить как исходную матрицу, так и ее транспонирование, если вы хотите последовательности, которые встречаются как в столбцах, так и в строках.
> which(diff(M)==0)
[1] 5 17 48 61 68 75
> which(diff(t(M))==0)
[1] 5 7 8 35 40 64 90
> M
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 4 7 6 5 4 4 5 5 5 10
[2,] 3 9 8 10 9 2 7 4 6 3
[3,] 6 3 6 4 8 3 10 6 10 4
[4,] 1 4 8 10 9 3 7 10 10 5
[5,] 5 8 5 7 7 6 5 7 1 10
[6,] 5 7 2 9 5 3 4 7 6 4
[7,] 9 3 8 2 8 2 5 9 8 6
[8,] 4 4 9 7 9 3 5 8 3 2
[9,] 6 4 6 10 3 6 3 9 4 1
[10,] 2 7 3 2 4 3 7 1 8 8
"5" в первом результате, который относится к 5 в позициях [5:6,1], в то время как 5 в "сделанном на транспонированном М" относится к 4 в положении [1, 5:6]. Соседние 7, о которых вы спрашивали, обозначены 35 во втором результате.
Возможно, вы захотите взглянуть на эти две матрицы. Вы можете добавить acolumn a FALSE в конце второй строки и строку o FALSE ниже первой, если вы хотите получить результаты в "соответствие" с оригиналом:
t(diff(t(M))==0)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] FALSE FALSE FALSE FALSE TRUE FALSE TRUE TRUE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[5,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[8,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
> diff(M)==0
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[5,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[8,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE