看板 R_Language 關於我們 聯絡資訊
看了 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 : 感恩各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.69.153 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503888683.A.35C.html
celestialgod: 嗯嗯,我findValue都用原本R函數確實會稍慢,這樣改 08/28 18:29
celestialgod: 完真的有改善不少@@ 08/28 18:29