看板 R_Language 關於我們 聯絡資訊
拋磚引玉,提供兩個方法XD ## 方法1: 使用 apply # 生成測試資料 d1 = data.frame(matrix(c(0,1,2,0,0,0,1,0,2,0,2,1),nrow=4,byrow=T)) d1 ### X1 X2 X3 ### 1 0 1 2 ### 2 0 0 0 ### 3 1 0 2 ### 4 0 2 1 apply(d1,1,function(x){ ind = which(x!=0) return(ifelse(length(ind)==0,0,x[min(ind)])) }) ## [1] 1 0 1 2 裡面的 ifelse 主要是針對 0,0,0 取 min(ind) 的時候會有 Warning 不然直接 return(x[min(which(x!=0))]) 也可以XD ## 方法2: 使用 data.table library(data.table) d2 = data.table(d1) findLeftValueF = function(input, ...){ x = unlist(input) ## 每一列都是 List 物件,所以要做 unlist ind = which(x!=0) return(ifelse(length(ind)==0,0,x[min(ind)])) } d2[, val := findLeftValueF(.SD),by=row.names(d2)] d2$val ## [1] 1 0 1 2 至於哪個比較快我就沒測了,應該會比 sapply 效率好點XD 有錯誤的話請板上各位大大再指教囉~ ※ 引述《s3714443 (metalheads)》之銘言: : http://imgur.com/a/1s7Is : 資料大概是長這樣 : 我想要處理的是: : 像第八行就有兩個非0的數字 : 那我就是取最左的那排 26.57這個數字 : 倒數第二排有26.43跟26.57這兩個數字 : 那就是取最左邊的26.43 : 反正就是 特定欄之中 先看有沒有非0的數字,有就取最左的,沒有就取0 : 然後就是mutate出來新的一行 : 我想不到除了sapply之外的辦法了 : 但是我的資料有500多萬筆 : sapply可能會跑到電腦燒掉XD : 感恩各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.57.26 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503825048.A.0CB.html ※ 編輯: swedrf0112 (1.169.57.26), 08/27/2017 17:13:01
celestialgod: apply底層就是sapply了... 08/27 17:12
swedrf0112: 感謝樓上c大 又學到了XD 08/27 17:14
celestialgod: 不管怎樣你的方式都是row-wise都會慢很多 08/27 17:45
celestialgod: 還是要想辦法直接用vectorise想法直接處理 08/27 17:45
celestialgod: 才是根解 08/27 17:45
s3714443: 對 因為資料很大 所以想用矩陣的思維處理 但還是感謝這 08/27 18:56
s3714443: 位大大 08/27 18:56
swedrf0112: 感謝!! 08/28 10:37