Re: [問題] 矩陣的處理...拜求各位大大

作者: swedrf0112 (M)   2017-08-28 10:51:20
看了 c 大的 code ,啟發良多XD
以下修改主要把 非 0 的 index, group by row 找最小的 column number,
再與 0 的 row bind 起來。
## data 來自 c 大的 code
DT2 <- data.table(X)
DT2[ , `:=`(V9 = sample(1:5, nrow(DT2), TRUE),
V10 = sample(LETTERS, nrow(DT2), TRUE))]
findValueF2 = function(X){
indm = as.matrix(data.table(which(X!=0, arr.ind = TRUE))[,min(col),by="row"]) ## 每個非0 row 的最左邊 column number
out_d1 = data.table(indm[,1],X[indm]) ## 指 index 與 value
out_d2 = data.table(V1=setdiff(seq_len(nrow(X)),indm[,1]), v2=0) ## 補 0
outd = rbindlist(list(out_d1,out_d2))[order(V1)] ## rbind 起來 by row order
return(outd$V2)
}
st1 <- proc.time()
DT[ , v := findValue(do.call(cbind, .SD)), .SDcols = V1:V8]
t1 = proc.time() - st1
st2 <- proc.time()
DT2[ , v := findValueF2(do.call(cbind, .SD)), .SDcols = V1:V8]
t2 = proc.time() - st2
t1
# user system elapsed
# 1.16 0.05 1.24
t2
# user system elapsed
# 0.28 0.01 0.29
all.equal(DT$v,DT2$v)
# [1] TRUE
※ 引述《s3714443 (metalheads)》之銘言:
: http://imgur.com/a/1s7Is
: 資料大概是長這樣
: 我想要處理的是:
: 像第8 row就有兩個非0的數字
: 那我就是取最左的那column 26.57這個數字
: 倒數第2 row 有26.43跟26.57這兩個數字
: 那就是取最左邊column的26.43
: 反正就是 先選取特定column(MA10down1~MA10donw9)之中
: 逐row先看有沒有非0的數字,有就取最左column的,沒有就取0
: 然後就是mutate出來新的一行
: 我想不到除了sapply之外的辦法了
: 但是我的資料有500多萬筆
: sapply可能會跑到電腦燒掉XD
: 感恩各位
作者: celestialgod (天)   2017-08-28 18:29:00
嗯嗯,我findValue都用原本R函數確實會稍慢,這樣改完真的有改善不少@@

Links booklink

Contact Us: admin [ a t ] ucptt.com