如何检查R中的矩阵中是否存在固定模式?
我想检查一个矩阵,看看是否存在固定模式“xxxx”或“yyyy”(我的矩阵可以有4个x或4个y的序列,但不能同时有两个。除非它小于4)。然后,例如,如果存在一个4x的序列,match不确定您的输出最终应该是什么样子,但原则上您可以使用如何检查R中的矩阵中是否存在固定模式?,r,regex,matrix,R,Regex,Matrix,我想检查一个矩阵,看看是否存在固定模式“xxxx”或“yyyy”(我的矩阵可以有4个x或4个y的序列,但不能同时有两个。除非它小于4)。然后,例如,如果存在一个4x的序列,match不确定您的输出最终应该是什么样子,但原则上您可以使用“x{4}”作为正则表达式,并使用apply/apply。例如: 注:对角线的积分也为 注2: 编辑 您可以基于any将逻辑封装到一个函数中,该函数执行上面的行,取消列出结果,并检查是否存在任何TRUE checkSequence <- function(M,
“x{4}”
作为正则表达式,并使用apply
/apply
。例如:
注:对角线的积分也为
注2:
编辑
您可以基于any
将逻辑封装到一个函数中,该函数执行上面的行,取消列出结果,并检查是否存在任何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
checkSequence不确定您的输出最终应该是什么样子,但原则上您可以使用“x{4}”
作为正则表达式,并使用apply
/apply
。例如:
注:对角线的积分也为
注2:
编辑
您可以基于any
将逻辑封装到一个函数中,该函数执行上面的行,取消列出结果,并检查是否存在任何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
checkSequence对于给定的矩阵m
,您期望的输出是什么?谢谢您的评论,我刚刚更新了我的问题。希望我已经解释清楚了@Ronakshah给定矩阵m
,您期望的输出是什么?谢谢您的评论,我刚刚更新了我的问题。希望我已经解释清楚了@Ronakshah这个答案在对角线部分帮助了我,但我的主要问题仍然是逻辑向量输出,我只想要一个逻辑答案“true”,如果它存在,“false”,否则。所以我可以在if-else语句中使用它。那么,如果任何行/列/对角线包括xxxx
或yyyy
,您的语句是否应该产生TRUE
?是的,这正是我想要的。因此,如果为true,基于x或y模式,我可以将“x”或“y”指定给变量匹配。我试图在我的示例代码中说明这一点。@如果我理解,请参阅更新。请注意,这还包括序列,例如yyy
,因为它是yyy
的子集。您的答案对我了解更多关于R编程的知识非常有帮助,但对于这个问题,我只想要xxxx,大于4是可以的,但不小于。这个答案帮助我了解对角线部分,但我的主要问题仍然是逻辑向量输出,我只想要一个逻辑答案“true”,如果它存在,“false”,否则。所以我可以在if-else语句中使用它。那么,如果任何行/列/对角线包括xxxx
或yyyy
,您的语句是否应该产生TRUE
?是的,这正是我想要的。因此,如果为true,基于x或y模式,我可以将“x”或“y”指定给变量匹配。我试图在我的示例代码中说明这一点。@如果我理解,请参阅更新。请注意,这还包括序列,例如yyy
,因为它是yyy
的子集。您的回答对我了解更多有关R编程的信息非常有帮助,但对于这个问题,我只想要xxxx,大于4是可以的,但不能小于4。
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
stopifnot(identical(apply(m, 1, paste, collapse=""),
apply(m, 1, function(x) Reduce(paste0, x))))
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 ')))