R_Language 板


LINE

各位大大晚安, 我有一份總共九個欄位約30萬筆的原始資料, 因為想要分成4組畫圖 所以第一個想到的事就是新增第十個欄位(稱作group), 然後根據某個欄位(假設為第八個欄位好了)的值分組, 並填入第十個欄位(group1~group4) 很笨的用for loop搭配if else寫,可是速度整個悲劇... 好讀程式碼請見: http://pastie.org/10200854 add.col.group <- function(data){ data$group <- 0 for(i in 1:nrow(data)){ if(data[i,8] < 0.25){data[i,10] <- "group1"} else if(data[i,8] < 0.5 & data[i,8] > 0.25){data[i,10] <- "group2" } else if(data[i,8] < 0.75 & data[i,8] > 0.5){data[i,10] <- "group3" } else {data[i,10] <- "group4" } } data } ## call function new.data <- add.col.group(data) 後來嘗試改成用sapply搭配自己寫的判斷函式 好讀程式碼請見: http://pastie.org/10200933 ## 判斷分組 assign.group <- function(value){ if(value < 0.25){return_value <- "group1"} else if(value < 0.5){return_value <- "group2" } else if(value < 0.75){return_value <- "group3" } else return_value <- "group4" return_value } ## 新增欄位並填入值 add.col.group <- function(data){ data$group <- 0 data$group <- sapply(data$avg, assign_group) ##avg即為第八個欄位的名稱 data } ## call function new_data <- add.col.group(data) 結果沒想到,速度竟然是爆發性的進展!!!(驚) (因為怕爆掉,先用2萬筆資料測試) 用for loop寫: user system elapsed 0.11 0.00 0.11 用sapply寫: user system elapsed 42.18 0.00 43.02 可是不知道這樣的寫法會不會很笨...還有更好的寫法嗎? 還是其實根本不應該用*apply寫? 還請各位高手大大指點一下,謝謝大家了! 後記: 原本是想要發文求指點sapply的寫法... 結果剛剛文章打到一半當掉的時候, 突然靈光乍現了! 雖然好像沒有很難, 可是能靠自己的力量想出來總是很開心的一件事啊>"< (儘管文章要重打很累XD) [環境敘述]: version.string R version 3.0.3 (2014-03-06) [關鍵字]: for loop, sapply --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.22.250
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1432236554.A.019.html
1F:→ obarisk: apply和for差不多吧,vectorize才會變快 05/22 09:06
2F:→ obarisk: 用cut+cbind 05/22 09:34
3F:→ obarisk: 或是用 nvec <- c(NA, length=nrow(da)) 05/22 09:34
4F:→ obarisk: nvec[da[, 8]<.25] <- "grp1" 05/22 09:35
5F:→ obarisk: 依此類推,最後再cbind 05/22 09:35
6F:推 gsuper: Function內包function是主因 05/22 13:57
7F:→ gsuper: 這種寫法很不容易寫 效率又會爆炸性的變差 真的是事倍功半 05/22 13:58
8F:→ gsuper: 另外一個大問題 05/22 14:30
9F:→ gsuper: 我直接開一篇好了 05/22 14:31
10F:→ andrew43: 二個關鍵:用 cut(),以及不要多次改寫 data frame。 05/22 22:33
11F:→ andrew43: 用對方法的話,20萬筆應該按enter就馬上有結果不會卡。 05/22 22:36
12F:→ locka: 在此先謝謝obarisk,gsuper,andrew43等大大熱情的回應。我 05/23 00:25
13F:→ locka: 覺得andrew大講到一個點,就是我一直想要改寫data frame, 05/23 00:25
14F:→ locka: 因為對我來說總覺得這樣資料比較好懂不會亂(似乎腦袋好像 05/23 00:25
15F:→ locka: 還停留在用一般dbms的table在理解r的data frame…)待我測 05/23 00:25
16F:→ locka: 試後有心得再跟大家分享,先謝謝大家了! 05/23 00:25
17F:→ andrew43: 我的「改寫」的意思是不要頻繁地改變data frame 05/23 01:08
18F:→ andrew43: 因為這會算很慢,並不是指不要改變data frame喔 05/23 01:09
19F:推 alasa15: 看起來dplyr可以完美解決你的問題 05/24 02:48







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

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

TOP