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

use*_*545 1 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
Run Code Online (Sandbox Code Playgroud)

这样的事情:

  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
Run Code Online (Sandbox Code Playgroud)

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

flo*_*del 12

像这样:

rowSums(dat) > 0L
Run Code Online (Sandbox Code Playgroud)

这将比使用循环或应用快得多...

  • *买者自负*:这不适用于缺失值。`any(c(NA, TRUE))` 结果为 `TRUE`,但 `sum(c(NA, TRUE))>0L` 结果为 `NA`。将参数“na.rm=T”添加到“rowSums”将解决这个困境。然而,当评估*所有*行是否为“TRUE”时,会发生相反的问题:在这种情况下,缺失值*应该*导致“NA”。`any` 和 `all` 适当地处理这两种情况。 (2认同)

luk*_*keA 5

apply(df, 1, any)
# YAL001C YAL002W YAL003W YAL004W YAL005C YAL007C 
#   FALSE   FALSE   FALSE   FALSE   FALSE    TRUE 
Run Code Online (Sandbox Code Playgroud)


Sve*_*ein 5

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

setNames(Reduce("|", dat), rownames(dat))
Run Code Online (Sandbox Code Playgroud)

dat数据框的名称在哪里.

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

setNames(Reduce("|", as.data.frame(mat)), rownames(dat))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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