Этого легко достичь с пакетом TraMineR
.
islander <- function(mat) {
require(TraMineR)
rows.mat.seq <- seqdef(mat) # seeks all sequences in rows
cols.mat.seq <- seqdef(t(mat)) # tranposed version
rows <- seqpm(rows.mat.seq, 22)$MIndex # seeks for sub sequence 2-2 in rows
cols <- seqpm(cols.mat.seq, 22)$MIndex # seeks for sub sequence 2-2 in columns
if (length(cols) == 0) { # the row case
mat[rows, which(mat[rows, ] == 2)] <- 4
return(mat)
} else { # the column case
mat[which(mat[, cols] == 2), cols] <- 4
return(mat)
}
}
Урожай
> islander(row.mat)
...
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 0
[2,] 0 0 0 0 0 0
[3,] 3 0 0 0 0 0
[4,] 3 0 0 0 0 2
[5,] 3 0 0 0 0 0
[6,] 3 0 0 0 4 4
> islander(col.mat)
...
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 0
[2,] 0 0 0 0 0 0
[3,] 3 0 0 0 0 0
[4,] 3 0 0 0 0 0
[5,] 3 0 0 0 0 4
[6,] 3 0 0 2 0 4
Примечание: Если ваш остров длиннее, вам нужно принять код, например, если длина острова 3, сделайте seqpm(., 222)
.Конечно, можно реализовать рассмотрение всех случаев в функции.
Данные
row.mat <- structure(c(1, 0, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2), .Dim = c(6L,
6L))
col.mat <- structure(c(1, 0, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2), .Dim = c(6L,
6L))
> row.mat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 0
[2,] 0 0 0 0 0 0
[3,] 3 0 0 0 0 0
[4,] 3 0 0 0 0 2
[5,] 3 0 0 0 0 0
[6,] 3 0 0 0 2 2
> col.mat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 0
[2,] 0 0 0 0 0 0
[3,] 3 0 0 0 0 0
[4,] 3 0 0 0 0 0
[5,] 3 0 0 0 0 2
[6,] 3 0 0 2 0 2