不确定您的输出最终应该是什么样子,但原则上您可以使用"x{4}" 作为正则表达式并使用apply/apply。 例子:
M
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] "y" NA NA "x" NA NA NA
# [2,] NA "y" NA NA "x" "x" NA
# [3,] "y" "y" "y" "y" NA "x" NA
# [4,] NA "y" "x" "y" "y" "x" "x"
# [5,] NA NA NA NA NA "x" NA
# [6,] NA "x" "x" "x" "x" NA NA
## rows
apply(M, 1, function(x) grepl("x{4}", Reduce(paste0, x)))
# [1] FALSE FALSE FALSE FALSE FALSE TRUE
apply(M, 1, function(x) grepl("y{4}", Reduce(paste0, x)))
# [1] FALSE FALSE TRUE FALSE FALSE FALSE
## columns
apply(M, 2, function(x) grepl("x{4}", Reduce(paste0, x)))
# [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE
apply(M, 2, function(x) grepl("y{4}", Reduce(paste0, x)))
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## diagonals
sapply(split(M, row(M) - col(M)), function(x) grepl("x{4}", Reduce(paste0, x)))
# -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
# FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
sapply(split(M, row(M) - col(M)), function(x) grepl("y{4}", Reduce(paste0, x)))
# -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
# FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
注意:对角线也归功于@user20650
注2:
stopifnot(identical(apply(m, 1, paste, collapse=""),
apply(m, 1, function(x) Reduce(paste0, x))))
编辑
您可以基于any 将逻辑包装到一个函数中,该函数执行上面的行,unlists 结果,并检查是否有任何TRUE。
checkSequence <- function(M, rx) {
any(unlist(
c(sapply(1:2, function(margin) apply(M, margin, function(x) grepl(rx, Reduce(paste0, x)))),
list(sapply(split(M, row(M) - col(M)), function(x) grepl(rx, Reduce(paste0, x)))))))
}
checkSequence(M, "x{4}")
# [1] TRUE
checkSequence(M, "y{4}")
# [1] TRUE
checkSequence(M, "y{3}")
# [1] TRUE
checkSequence(M, "y{5}")
# [1] FALSE
数据:
M <- unname(as.matrix(read.table(header=T, text='
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "y" NA NA "x" NA NA NA
[2,] NA "y" NA NA "x" "x" NA
[3,] "y" "y" "y" "y" NA "x" NA
[4,] NA "y" "x" "y" "y" "x" "x"
[5,] NA NA NA NA NA "x" NA
[6,] NA "x" "x" "x" "x" NA NA ')))