簡體   English   中英

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

[英]How to check if there exist a fixed pattern in a matrix in R?

我想檢查一個矩陣,看看是否存在固定模式“xxxx”或“yyyy”,(我的矩陣可以有4個x或4個y的序列,不能同時有。除非它小於4) . 然后,例如,如果存在 4 個 x 的序列,則匹配 <-“x”,否則匹配 <-“y”。 我想按行、按列和(反)對角線檢查它。

主要問題在於最后一部分,將“x”或“y”分配給變量“match”。

我的矩陣的一個例子是:

m <- matrix(NA, 6, 7)
m[6,2:5] <- "x"

我對 x 和 y 進行了如下嘗試:

r <- apply(m, 1, paste, collapse="")
c <- apply(m, 2, paste, collapse="") 

if (grepl("xxxx", r, fixed = TRUE) |
      grepl("xxxx", c, fixed = TRUE)){
    match <- "x"}
  else if(grepl("yyyy", r, fixed = TRUE)|
          grepl("yyyy", c, fixed = TRUE)){
    match <- "y"}

但是,它不起作用,因為“grepl”返回一個邏輯向量並且它只檢查第一個元素是否為真。 我已經努力尋找 4 天的方法了,甚至想不出一種方法來嘗試以對角線方式找到這種模式。

我是使用 R 編程的新手,非常感謝任何幫助。

不確定您的 output 最終應該是什么樣子,但原則上您可以使用"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))))

編輯

您可以將邏輯包裝到 function 中,基於any ,執行上面的行, unlist s 結果,並檢查是否有任何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    ')))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM