有没有办法转换这些数据:
(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)
这将比使用循环或应用快得多...
apply(df, 1, any)
# YAL001C YAL002W YAL003W YAL004W YAL005C YAL007C
# FALSE FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
如果您的数据在数据框中,这是一种快速的方法:
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解决方案用于一般情况.
| 归档时间: |
|
| 查看次数: |
6164 次 |
| 最近记录: |