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/cn.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灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP