有什么方法可以转换这些数据:
(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,则YAL007C
为TRUE
。
答案 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
解决方案。