我正在按照这种方法在(0,1)矩阵中找到1的矩形
Find 5 consecutive numbers >= 3 for each row of a matrix
但是当我尝试找到像此矩阵中的1x4矩形(1行和4列)时出现问题
m <- matrix(c(0,1,1,1,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0), nrow = 6, ncol = 5, byrow = TRUE)
有四个矩形:第1行,第4行,第5行和第6行
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 1 1 1
[2,] 0 0 0 1 0
[3,] 1 0 0 1 0
[4,] 1 1 1 1 0
[5,] 0 1 1 1 1
[6,] 1 1 1 1 0
当我运行这个案例的代码时,我得到了4个结果,但是其中两个(第4行和第6行)两个结果都从第一列开始,但结果我得到的是第5列的起始列和第8列的结束列矩阵是6x5,无法找出问题所在。
b<-m
for (j in 1:5){
cont<-1
for (i in 6:1) {
if (m[i,j]==0){
cont<-1
b[i,j]<-NA}
else {b[i,j]<-cont
cont<-cont+1}
}
}
mdat<-b
apply(mdat, 1, function(x) {
r <- rle(x >= 1)
w <- which(!is.na(r$values) & r$values & r$lengths >=4)
if (length(w) > 0) {
before <- sum(r$lengths[1:(w[1]-1)])
c(before+1,before+ r$lengths[w[1]])
} else
NULL
})
[[1]]
[1] 2 5
[[2]]
NULL
[[3]]
NULL
[[4]]
[1] 5 8
[[5]]
[1] 2 5
[[6]]
[1] 5 8
答案 0 :(得分:2)
您需要更改before
变量的计算,因为如果行以1的序列开头,它不起作用:
apply(mdat, 1, function(x) {
r <- rle(x >= 1)
w <- which(!is.na(r$values) & r$values & r$lengths >=4)
if (length(w) > 0) {
before <- sum(r$lengths[1:w[1]]) - r$lengths[w[1]]
c(before+1,before+r$lengths[w[1]])
} else
NULL
})
问题如下:
before <- sum(r$lengths[1:(w[1]-1)])
仅当1的序列不在第一个位置(即w> 1)时才能正常工作。
顺便说一句,请注意,您的代码只考虑行中的第一个序列,忽略其他序列(如果存在) 例如假设有一个矩阵row = c(0,1,1,1,1,0,1,1,1,1)
,它只返回c(2,5)
而不是c(2,5), c(7,10)
如果您想要返回所有序列的内容,可以使用以下代码:
apply(mdat, 1, function(x) {
r <- rle(x >= 1)
w <- which(!is.na(r$values) & r$values & r$lengths >=4)
if (length(w) > 0) {
lapply(w,FUN=function(w1){ before <- sum(r$lengths[1:w1]) - r$lengths[w1];
c(before+1,before+r$lengths[w1]) })
} else
NULL
})
N.B。它返回一个列表,其中每个元素都是包含对
的列表