【问题标题】:Selecting rows based on multiple columns in R基于R中的多列选择行
【发布时间】:2013-10-30 02:36:29
【问题描述】:

我有一个这样的数据框

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

【问题讨论】:

  • 你写你有一个data.frame,但显示一个矩阵。您在这里不需要whichans&lt;-M2[M2[,1]==0 &amp; M2[,2]==0 &amp; M2[,4]==0,] 是否足以满足您的需求?

标签: r


【解决方案1】:

只是为了好玩,一个适用于 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,]

【讨论】:

    【解决方案2】:

    你可以使用 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
    

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

    【讨论】:

    • @SeñorO:谢谢,我简化了。
    • 试试M2[rowSums(M2[,c(1,2,3,4)] != 0) == 0,]
    【解决方案3】:

    你的问题对我来说不是很清楚,但这就是你要找的吗?

    要根据第 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 都为零。

    【讨论】:

    • 我认为问题的重点是请求一种不需要逐列方法的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多