我正在寻找一个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)))
答案 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