Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查R中的矩阵中是否存在固定模式?_R_Regex_Matrix - Fatal编程技术网

如何检查R中的矩阵中是否存在固定模式?

如何检查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,

我想检查一个矩阵,看看是否存在固定模式“xxxx”或“yyyy”(我的矩阵可以有4个x或4个y的序列,但不能同时有两个。除非它小于4)。然后,例如,如果存在一个4x的序列,match不确定您的输出最终应该是什么样子,但原则上您可以使用
“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    ')))