Re: [問題] 找出各row最大值的colnames

作者: celestialgod (天)   2016-06-16 20:40:29
※ 引述《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%時間
作者: po5113 (π)   2016-06-16 22:28:00
自己沒想到這樣寫就可以了...QQ還有很多不熟悉的地方,感謝!!

Links booklink

Contact Us: admin [ a t ] ucptt.com