如何删除矩阵中的行

时间:2014-01-30 20:17:00

标签: r matrix delete-row

我伪造一个矩阵如下。

a = rep(1:4, each=2)
b = rep(0:1, times=4)
m = cbind(a, b)
m
a b
[1,] 1 0
[2,] 1 1
[3,] 2 0
[4,] 2 1
[5,] 3 0
[6,] 3 1
[7,] 4 0
[8,] 4 1

我需要删除a==4b==0的所有行。我知道如何选择这样的行:

m[m[,1]==4 & m[,2]==0,]
a b 
4 0 

但我不知道如何删除它们。我知道在这种特殊情况下我可以做m[-7,]。但是图像是一个巨大的矩阵,我无法直观地检查哪些行满足a==4b==0的条件。我也试过这个:

count=1:8
m.count = cbind(m, count)
m.count[m.count[,1]==4 & m.count[,2]==0,]
a     b count 
4     0     7 

因此,这将自动告诉我哪些行符合条件,然后我可以使用索引c=count[3](如果只有一行)或c=count[,3](如果多行)并尝试{{1获得正确的结果。

但是这个解决方案太冗长了。有谁知道解决问题的简单方法?我应该以一些聪明的方式使用m[-c,]来完成它。

2 个答案:

答案 0 :(得分:3)

只需反转您选择行的条件:

m[! (m[, 1] == 4 & m[, 2] == 0), ]

或者确实(根据De Morgan):

m[m[, 1] != 4 | m[, 2] != 0, ]

答案 1 :(得分:1)

我认为你只需要?which

m <- m[-which(m[,1] == 4 & m[,2] == 0),]

测试:

# Konrad's !

> system.time(rep(m[! (m[, 1] == 4 & m[, 2] == 0), ],10000000))
   user  system elapsed 
  0.264   0.094   0.357 

# BB's which
> system.time(rep(m[-which(m[,1] == 4 & m[,2] == 0),],10000000))
   user  system elapsed 
  0.244   0.109   0.354