R_Language 板


LINE

※ 引述《clansoda (小笨)》之銘言: : 我自己來回我自己的問題 我採用的解法是andrew大的解法 : C版的解法看起來應該是最快的 但是小弟無法理解在幹嘛 : 所以選擇了一個看起來比我的快很多又能理解的方法 : kk <- Sys.time() : klist <- lapply(1 : NROW(target), function(k){ : target[k,] %>% as.numeric %>% .[!is.na(.)] : }) : test <- lapply(klist, function(k) { : m <- logical(20) : m[k] <- TRUE : return(m) : }) %>% do.call(rbind, .) : Sys.time() - kk : Time difference of 53.88025 secs : 我稍微修正過andrew大在提取每個row裡的值成為list的這一段碼 : 這樣可以將速度從180幾秒提到50秒左右 : 以我目前這個50萬row的資料等級來說這個速度我個人可以接受了 : 等到C大提點他的程式碼的邏輯以後可能會再修改我的寫法 : 目前先到這樣 感謝各位先進的提供的作法 受益良多 結果應該是一樣的,程式: library(data.table) target <- fread(' a b c 2 5 NA 1 NA NA 1 2 3 3 NA NA 2 4 NA 1 4 5 ') mat <- as.matrix(target) library(magrittr) system.time({ klist <- lapply(1 : NROW(target), function(k){ target[k,] %>% as.numeric %>% .[!is.na(.)] }) test <- lapply(klist, function(k) { m <- logical(5) m[k] <- TRUE return(m) }) %>% do.call(rbind, .) }) system.time({ idx <- nrow(mat) * (mat - 1L) idx <- idx[which(!is.na(idx))] + which(!is.na(mat), arr.ind = TRUE)[, 1] out <- matrix(FALSE, nrow(mat), 5L) out[idx] <- TRUE dim(out) <- c(nrow(mat), 5L) }) all.equal(test, out) # TRUE 我程式有點偷懶,是因為假設level數跟input的coloumn數會一樣 我這裡解釋一下我的程式邏輯: 我們先看一下輸出的結果 [,1] [,2] [,3] [,4] [,5] [1,] FALSE TRUE FALSE FALSE TRUE [2,] TRUE FALSE FALSE FALSE FALSE [3,] TRUE TRUE TRUE FALSE FALSE [4,] FALSE FALSE TRUE FALSE FALSE [5,] FALSE TRUE FALSE TRUE FALSE [6,] TRUE FALSE FALSE TRUE TRUE 第一列是2, 5要為TRUE,對應到input的第一列 2, 5, NA 第二列是1是TRUE,對應到input的第一列 1, NA, NA 所以我只要有(1, 2), (1, 5), (2, 1), ... 的位置向量 就可以把TRUE位置都描述出來 而且(1, 2), (1, 5), ...這些位置也可以用一個index表示 (這裡計算是根據coloumn-major的矩陣,row-major則會有一點不同) 矩陣中 (1, 2)位置其實可以用 1 + nrow(matrix) * (2 - 1) = 7 (這列有6個row) (1, 5)位置可以用 1 + nrow(matrix) * (5 - 1) = 25 (2, 1)位置可以用 2 + nrow(matrix) * (1 - 1) = 2 ... 來表示 所以我們可以得到一個通式: (i, j) => i + nrow(matrix) * (j - 1) 換到我的程式上來看 這行 idx <- nrow(mat) * (mat - 1L) 是把後面那個部分算出來 可是因為mat裡面充滿了NA,所以要滿NA先移除掉就有了下一行的前半段: idx[which(!is.na(idx))] 那i要怎麼辦,就利用which + !is.na去把對應的列位置取出 於是我們就得到了TRUE位置的index: idx <- idx[which(!is.na(idx))] + which(!is.na(mat), arr.ind = TRUE)[, 1] 那最後我只要把output的矩陣弄出來: out <- matrix(FALSE, nrow(mat), 5L) # 這裡的5是指target中最大的數字,可以用max(mat[!is.na(mat)])取得 然後再把TRUE位置補上,改一下dim: out[idx] <- TRUE dim(out) <- c(nrow(mat), 5L) # 這個5同前面的5意思 如此一來就可以得到正確答案了 這個方法比較tricky一點,但是向量化的精神就在這裡 向量化的程式需要一點的數學 跟 邏輯推演,不是那麼直覺就寫得出來 但是它的performance會真的很好~~~~ -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.42.16
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1482834566.A.09D.html ※ 編輯: celestialgod (118.170.42.16), 12/27/2016 18:30:15
1F:→ andrew43: 推好心解釋。這算法有趣。 12/28 01:49
2F:推 clansoda: 感謝C大 我研究一下後看懂了 向量化至少快50倍 12/29 14:37
3F:→ clansoda: 我想請問為什麼我最初的那個方法那麼慢 是因為我每一次 12/29 14:37
4F:→ clansoda: 指定column數的時候 都會在複製一次整個data.table嗎 12/29 14:38
5F:→ celestialgod: 因為data.table那樣改值很慢,要用set,另外這個用m 12/29 18:52
6F:→ celestialgod: atrix改值還會比這個快 12/29 18:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP