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

看板R_Language作者 (M)時間6年前 (2017/08/28 10:51), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串4/5 (看更多)
看了 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

08/28 18:29, , 1F
嗯嗯,我findValue都用原本R函數確實會稍慢,這樣改
08/28 18:29, 1F

08/28 18:29, , 2F
完真的有改善不少@@
08/28 18:29, 2F
文章代碼(AID): #1PeuKhDS (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1PeuKhDS (R_Language)