有条件地删除R中的行

muk1a3rh  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(122)

考虑以下矩阵:

testMat <- matrix(c(1,2,1,3,
                 3,2,3,3,
                 1,3,1,3,
                 2,3,3,3,
                 3,3,3,3,
                 3,2,3,1), byrow = T, ncol = 4)

和以下条件:

cond <- c(0,0) # binary

**问题:**如果cond[1]0,并且第一列或第三列中存在1,则将移去相应的行。同样,如果cond[2]0,并且第二列或第四列中存在1,则将移去相应的行。例如,新矩阵将为:

newMat <- testMat[-c(1,3,6),] # for cond <- c(0,0)
newMat <- testMat[-c(1,3),] # for cond <- c(0,1)
newMat <- testMat[-c(6),] # for cond <- c(1,0)
newMat <- testMat # for cond <- c(1,1)

我试着用下面的方式,但这既错误又笨拙

newMat <- testMat[-(cond[1] == 0 & testMat[,c(1,3)] == 1),]
newMat <- newMat[-(cond[2] == 0 & newMat[,c(2,4)] == 1),]

你能帮忙找到一个R基溶液吗?

7d7tgy0s

7d7tgy0s1#

这是丑陋的,但似乎工作:
(对于cond的长度是一般化的,假设矩阵具有length(cond)*2列)

keepRows <- apply(testMat, 1,
                  function(rw, cond) {
                    logicrow <- vector(length=2)
                    for (b in 1:length(cond)) {
                      logicrow[b] <- ifelse(cond[b]==0, all(rw[b]!=1) & all(rw[length(cond)+b]!=1), TRUE)
                    }
                    all(logicrow)
                  }, cond = cond)

newMat <- testMat[keepRows, ]

(根据评论编辑)

0s0u357o

0s0u357o2#

假设1)cond可以是任意长度,2)testMat具有偶数列,以及3)规则是查看testMat的第i列和第(i+2)列

cond=c(0,0)

unlist(
  sapply(
    1:length(cond),
    function(i){
      j=rowSums(testMat[,c(i,i+2)]==1)
      if (cond[i]==0 & sum(j)>0) which(j>0) else nrow(testMat)+1
    }
  )
)
[1] 1 3 6

返回满足您的条件的行,则可以删除这些行

testMat[-.Last.value,]

相关问题