查找逻辑矩阵的每一行是否至少有一个TRUE

时间:2014-02-01 13:10:16

标签: r matrix

有什么方法可以转换这些数据:

        (Intercept) Timecoursecdc15 Timecoursecdc28 Timecourseclb Timecoursecln
YAL001C       FALSE           FALSE           FALSE         FALSE         FALSE
YAL002W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL003W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL004W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL005C       FALSE           FALSE           FALSE         FALSE         FALSE
YAL007C       FALSE           FALSE           FALSE         FALSE          TRUE

这样的事情:

  YPR163C   YPR164W   YPR165W   YPR166C   YPR167C   YPR168W   YPR169W   YPR170C 
    FALSE     FALSE     FALSE      TRUE     FALSE     FALSE     FALSE     FALSE 
  YPR171W   YPR172W   YPR173C   YPR174C   YPR175W   YPR176C   YPR177C   YPR178W 
    FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE 
  YPR179C   YPR180W   YPR181C   YPR182W   YPR183W   YPR184W   YPR185W   YPR186C 
    FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE 
  YPR187W   YPR188C   YPR189W   YPR190C   YPR191W   YPR192W   YPR193C   YPR194C 
    FALSE     FALSE     FALSE      TRUE     FALSE     FALSE     FALSE     FALSE 
  YPR195C   YPR196W   YPR197C   YPR198W   YPR199C   YPR200C   YPR201W   YPR202W 
    FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE

因此,查看每行的值,如果任何行包含TRUE,则YAL007CTRUE

3 个答案:

答案 0 :(得分:12)

像这样:

rowSums(dat) > 0L

比使用循环或应用...要快得多......

答案 1 :(得分:5)

apply(df, 1, any)
# YAL001C YAL002W YAL003W YAL004W YAL005C YAL007C 
#   FALSE   FALSE   FALSE   FALSE   FALSE    TRUE 

答案 2 :(得分:5)

如果您的数据位于数据框中,这是一种快速的方法:

setNames(Reduce("|", dat), rownames(dat))

其中dat是数据框的名称。

如果您有矩阵,可以使用:

setNames(Reduce("|", as.data.frame(mat)), rownames(dat))

其中mat是矩阵的名称。

后一个命令适用于矩阵和数据帧。


性能检查(基于问题中的示例数据):

testDF <- read.table(text = "(Intercept) Timecoursecdc15 Timecoursecdc28 Timecourseclb Timecoursecln
YAL001C       FALSE           FALSE           FALSE         FALSE         FALSE
YAL002W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL003W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL004W       FALSE           FALSE           FALSE         FALSE         FALSE
YAL005C       FALSE           FALSE           FALSE         FALSE         FALSE
YAL007C       FALSE           FALSE           FALSE         FALSE          TRUE",
                 check.names = FALSE)

applyFun <- function() apply(testDF, 1, any)
rowSumsFun <- function() rowSums(testDF) > 0L
ReduceFun <- function() setNames(Reduce("|", testDF), rownames(testDF))

library(microbenchmark)

Unit: microseconds
         expr     min       lq   median       uq     max neval
   applyFun() 234.444 237.6535 239.7680 250.0900 823.751   100
 rowSumsFun() 153.645 155.8345 157.1610 159.5245 387.071   100
  ReduceFun()  55.588  57.9465  60.1465  61.9545 370.339   100



# create data frame with 10000 times as many rows as the original one
testDF <- do.call(rbind, replicate(10000, testDF, simplify = FALSE))

microbenchmark(applyFun(), rowSumsFun(), ReduceFun())
Unit: milliseconds
         expr        min         lq    median        uq       max neval
   applyFun() 337.457512 395.721527 429.13247 474.37774 698.43850   100
 rowSumsFun()   5.591884   7.765213   9.17471  10.21152  16.93731   100
  ReduceFun()   9.900725  11.418231  12.95423  13.32382  16.20043   100

摘要:对于少量行,基于Reduce的方法是最有效的方法,但基于rowSums的方法最适合大数据帧。对于一般情况,我更倾向于使用rowSums解决方案。