根据R中的多个列选择行

时间:2013-10-29 18:06:43

标签: r

我有一个像这样的数据框

 M2 <- matrix(c(1,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0),nrow=7, 
  dimnames=list(LETTERS[1:7],NULL)) 

我想根据多列选择行。例如,当我想仅根据两列选择行时,我做了

 ans<-M2[which(M2[,1]==0 & M2[,2]==0)

但是当我想根据三列或四列选择那些零值的行时,比如说基于1,3和4列,或者说1,2,3,4,我该怎么做? / p>

3 个答案:

答案 0 :(得分:8)

只是为了一个有趣的解决方案,适用于data.frame,可以用于大量的列:

DF <- as.data.frame(M2)
DF[rowSums(sapply(DF[,c(1,2,4)],`!=`,e2=0))==0,]
#  V1 V2 V3 V4
#B  0  0  0  0
#F  0  0  0  0
#G  0  0  0  0

这里发生了什么?

  1. sapply遍历子集DF[,c(1,2,4)]的列。它将函数!=(不等于)应用于子集的每一列,并与0进行比较(e2!=函数的第二个参数)。结果是一个逻辑值矩阵(TRUE / FALSE)。
  2. rowSums获取此逻辑矩阵的每一行的总和。逻辑值自动强制为1/0。
  3. 然后测试这些行总和是否为0(即行中的所有值不等于0)。
  4. 生成的逻辑向量用于对行进行子集化。
  5. 当然,使用矩阵更简单,更快捷:

    M2[rowSums(M2[,c(1,2,4)] != 0) == 0,]
    

答案 1 :(得分:4)

您可以使用rowSums:

M2[rowSums(M2[,c(1,2,3,4)]) == 0,]

为您提供列1,2,3和4为零的所有行:

  [,1] [,2] [,3] [,4]
B    0    0    0    0
F    0    0    0    0
G    0    0    0    0

请注意,如果矩阵中有正数和负数,则无效。

答案 2 :(得分:0)

你的问题对我来说不是很清楚,但这是你在寻找什么?

要根据第1列到第4列的值进行选择,您将执行以下操作:

ans <- M2[M2[,1]==0 & M2[,2]==0 & M2[,3]==0 & M2[,4]==0,]

 #> ans
 #  [,1] [,2] [,3] [,4]
 #B    0    0    0    0
 #F    0    0    0    0
 #G    0    0    0    0

这将导致M2的子集,其中所有列1到4都为零。