R_Language 板


LINE

※ 引述《phil5566 (5566)》之銘言: : [問題類型]: : 效能諮詢(我想讓R 跑更快) : [軟體熟悉度]: : 新手(沒寫過程式,R 是我的第一次) : [問題敘述]: : 小弟自己產生一組data叫做"T"的矩陣, : 想把其中"T"的第5行(T[,5])和第6行(T[,6])的數據, : 挑出來整理成一個120X3的矩陣,假設叫"G", : T[,5]的數值有10,16,22,28,34,40,6個可能, : T[,6]的數值有0.5,1.5,2.5,.........,19.5和inf的可能, : 整理方法: : G的第一行(G[,1]):放0.5,1.5,....,19.5(20個數,6個循環,共120個) : G的第二行(G[,2]):放的東西比較麻煩,即 : T[,5]=10的情況下,對應到T[,6]那些0.5,1.5,.....,19.5,inf的數值 : 計算他們的累積比率,假設T[,5]=10,有100筆data, : T[,5]=10且T[,6]<=0.5(或者T[,6]<=1)有22筆, : 則它算出的累積比率為22/100=0.22,依此類推..., : 算到T[,5]=10且T[,6]<=19.5(或者T[,6]<=20)的累積比率 : 共20個數字放到G[1:20,2],重複以上模式處理T[,5]=16,22,28,34,40的情形 : 分別放到G[21:40,2],G[61:80,2],.....,G[101:120,2] : G的第三行(G[,3]):G[1:20,3]放10,G[21:40,3]放16,......G[101:120,3]放40 : ________________________________________________________________________ : 小弟之前是用table函數處理, : 直接table(T[,5],T[,6])得到分類結果 : 再分別計算累積比率,沒用到廻圈, : 但考慮到"假設T[,6]可能沒有出現5.5的情況", : table函數分類後就不會有5.5的這個分類, : 所以小弟又重新寫,用兩個廻圈來整理data, : 第一個廻圈是在處理G[,1]和G[,3],第二個廻圈在處理G[,2] : 以下附上code範例, : 想請教版上各位高手,大大有沒有更漂亮,快速的處理方法, : 指教了,謝謝~ : [程式範例]: : http://pastebin.com/bw0C2YNJ : [環境敘述]: : R x64 3.3.1 : [關鍵字]: : data整理 # generage T[,5]跟T[,6] targetMat <- cbind(sample(c(10,16,22,28,34,40), 2e4, TRUE), sample(c(seq(0.5,19.5,by = 1), Inf), 2e4, TRUE)) # 取unique的T[,5] g1 <- unique(targetMat[ , 1]) # 取T[,6] min ~ max(除去Inf),間隔1的序列,共20個 g2 <- seq(min(targetMat[ , 2]), max(targetMat[is.finite(targetMat[,2]), 2]), by = 1) # 展開g1跟g2,並加一行轉成矩陣 outputDF <- expand.grid(g1, g2) outputMat <- as.matrix(cbind(outputDF[order(outputDF$Var1, outputDF$Var2), ], 0)) # 用tapply計算每一個g1, g2對應的次數,第一個input隨意放即可,沒用到,我這裡放1 resMat <- tapply(rep(1, nrow(targetMat)), list(targetMat[,1], targetMat[, 2]), length) # 用cumsum算出累積次數,再用sweep算累積比率 # 最後再把矩陣拉直,變成outputMat的第三行 outputMat[ , 3] <- as.vector(sweep(apply(resMat[ , 1:20], 1, cumsum), 2, rowSums(resMat), `/`)) 最後一行可能要花時間消化一下,先從 apply(resMat[ , 1:20], 1, cumsum) 看起 然後去看sweep用法 看一下 rowSums(resMat) 代表的意義 組合起來就是你要的累積比率 另外要注意我有先對outputMat排序,才能直接放進去 再寫的時候要注意順序錯了,塞進去的結果就會不對了 -- 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.46.59
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1485855748.A.626.html
1F:推 phil5566: 謝謝C大回答~這個方法蠻厲害的,完全沒用到廻圈 01/31 22:21
2F:→ phil5566: 但還是有幾點疑問?您說的outputMat排序是指 01/31 22:23
3F:→ phil5566: order(outputDF$Var1, outputDF$Var2)吧?order(X,Y)排序 01/31 22:24
4F:→ phil5566: 原則是否先比X再比Y,比完後越小的放越前面? 01/31 22:26
對,相比X再比Y,預設是increasing or ascending排序
5F:推 phil5566: 最後一行我還可以理解,只是tapply那一行就看不太懂? 01/31 22:29
6F:→ phil5566: google"tapply"的用法還是有看沒有懂,能否麻煩C大解說一 01/31 22:30
tapply(x, y, fun): x是目標向量 y可以是向量或是list,向量長度要和x長度相同 若是list,每個元素的長度都要和x長度相同 fun是每一組要做的動作 舉例: tapply(1:6, rep(1:2, 3), mean) x y 1 1 2 2 3 1 就是y=1的對應的x取mean跟 1 2 (這個是group) 4 2 y=2的對應的y取mean => 3 4 (這個是value) 5 1 6 2 如果第二個是list tapply(1:6, list(rep(1:2,3), rep(1:3, each=2)), mean) x y1 y2 1 1 1 2 2 1 3 1 2 4 2 2 5 1 3 6 2 3 這樣就是 y1=1, y2=1的一組,y1=2, y2=1的一組, ... 分別取mean 這些其實在?tapply都可以找到,不需要google 我覺得看R程式範例去學習也是很重要的,要自己想辦法學習阿~~ 我的程式碼應該就簡單懂了,根據g1跟g2的分組計算每組的length
7F:推 phil5566: 下?最後就是假設產生sample的那個步驟如果只有產生10個 01/31 22:34
8F:→ phil5566: 那您做g2那個動作,取min還會取到0.5嗎?謝謝 01/31 22:35
9F:→ phil5566: 可能是我沒說清楚,我指的是不論今天sample產生出來是什 01/31 22:38
10F:→ phil5566: 都一定要有0.5,1.5,......,19.5這20個數的存在 01/31 22:40
對不起,我考慮的不夠周到,那你只能寫死了 g2 <- seq(0.5, 19.5, by = 1)
11F:推 phil5566: 讚讚讚~ 02/01 01:13
最後順便回答你前一篇的問題 benchmark是評比的意思 你可以把程式分段去看執行時間 或是 直接使用profvis這個套件 可以比較容易抓出程式瓶頸的部分 再根據瓶頸部份去改善 柏拉圖法則:80%的速度瓶頸來自20%的程式碼 ※ 編輯: celestialgod (118.170.46.59), 02/01/2017 02:05:39
12F:推 phil5566: 馬上來試試 02/01 18:34







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燈, 水草

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

TOP