我有一个像这样的数据框
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>
答案 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
这里发生了什么?
sapply
遍历子集DF[,c(1,2,4)]
的列。它将函数!=
(不等于)应用于子集的每一列,并与0进行比较(e2
是!=
函数的第二个参数)。结果是一个逻辑值矩阵(TRUE / FALSE)。rowSums
获取此逻辑矩阵的每一行的总和。逻辑值自动强制为1/0。 当然,使用矩阵更简单,更快捷:
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都为零。