0

我有一个这样的数据框

 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 ,我该怎么做?

4

3 回答 3

9

只是为了好玩,一个适用于 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. 生成的逻辑向量用于对行进行子集化。

当然,使用矩阵更容易更快:

M2[rowSums(M2[,c(1,2,4)] != 0) == 0,]
于 2013-10-29T18:22:03.123 回答
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

请注意,如果矩阵中有正数和负数,这将不起作用。

于 2013-10-29T18:17:48.557 回答
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 都为零。

于 2013-10-29T18:16:57.933 回答