※ 引述《po5113 (π)》之铭言:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 新手(没写过程式,R 是我的第一次)
: [问题叙述]:
: 想找出row里面的最大值并挑出该值的colnames
: 资料与前几篇matrix找最大值的column name类似
: 部分资料如下:
: [,1] [,2] [,3]
: [1,] 3.490245e-11 8.579553e-05 9.999142e-01
: [2,] 3.020358e-11 7.424585e-05 9.999258e-01
: [3,] 7.690743e-12 1.890628e-05 9.999811e-01
: [4,] 8.779051e-10 2.153561e-03 9.978464e-01
: [5,] 6.732860e-20 1.655181e-13 1.000000e+00
: [6,] 9.544444e-15 2.346370e-08 1.000000e+00
: [7,] 4.519803e-13 1.111130e-06 9.999989e-01
: ...
: ...
: 不过目的在找出各row中最大值所在的column name
: 因此output中会有跟row number一样的个数
: 有想过用apply加上colnames
: 但似乎是遇到了点瓶颈
: 想请问在处理各列单行内的资料时
: 是否有适合使用的函数或其他写法呢?
: 感谢各位提供宝贵的意见!
:
: [关键字]:
: row, max, column names
根据我的测试,十万列,apply都还很快,0.57秒而已XD
numCols <- 1e2
numRows <- 1e5
mat <- matrix(rnorm(numCols*numRows), numRows, dimnames = list(NULL,
paste0(sample(LETTERS, numCols, TRUE), 1:numCols)))
st <- proc.time()
loc_max <- apply(mat, 1, which.max)
out <- colnames(mat)[loc_max]
proc.time() - st
# user system elapsed
# 0.53 0.04 0.57
如果觉得太慢,需要加速什么的可以试试看matrixStats:
library(matrixStats)
st <- proc.time()
loc_max <- rowOrderStats(mat, which = 1)
out2 <- colnames(mat)[loc_max]
proc.time() - st
# user system elapsed
# 0.12 0.00 0.12
all.equal(out, out2) # TRUE
只要原本的20%时间