检测R中矩阵中数字模式的位置

时间:2014-06-24 13:31:32

标签: r pattern-matching detection

我正在寻找一个R函数,它检测矩阵或数字数据帧中模式(数字向量)的位置。

由于

斯特凡

示例:

pattern <- c(2,2,2,2)
data<-t(data.frame(
    v1 = c(2,2,2,1,0,0,0,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
    v2 = c(2,2,2,9,9,0,0,0,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
    v3 = c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,1,1,0,0,0),
    v4 = c(2,2,2,2,2,2,0,1,1,1,0,0,0,0,NA,NA,NA,NA,NA,NA)))

2 个答案:

答案 0 :(得分:1)

这样的东西
which(apply(pattern == data, 2, all))
#[1] 1 2 3

应该做的伎俩。我们利用了矩阵按列存储并且pattern将被重用的事实。

效率稍高

which(colSums(pattern == data) == nrow(data))
#[1] 1 2 3

答案 1 :(得分:0)

根据您的新规则,这可能会有所帮助:

data1 <- data
#changing some elements to test the code
data1[2,8] <-2 
data1[4,1] <- 1

##The code is for the row

indx <- which(t(sapply(split(data1 == pattern, row(data1)), {
function(x) colSums(sapply(1:(length(x) - 3), function(i) x[seq(i, i + 3)]), 
    na.rm = TRUE) == 4
})), arr.ind = TRUE)
indx
# row col
# 3   3   1
#3   3   2
#4   4   2
#3   3   3
#4   4   3
#3   3   4
#3   3   5
#3   3   6
#3   3   7
#3   3   8
#3   3   9
#3   3  10
#3   3  11

以前代码中的校正操作的修正

 which(apply(pattern==data, 2, function(x){if(all(!is.na(x) & x)) x else rep(FALSE, 4)}),arr.ind=TRUE)

将模式更改为1

 pattern <- rep(1,4)
  which(apply(pattern==data, 2, function(x){if(all(!is.na(x) & x)) x else rep(FALSE, 4)}),arr.ind=TRUE)
 #row col