R_Language 板


LINE

關於資料整理,我很想推dplyr這個套件, 以及magrittr所導入的pipeline語法。 借你的問題來跟大家分享一下如何用dplyr來解決這種問題 : 各位大大好,小弟在做coursera的作業時有一題要求把 : 一個給定的data.frame(叫做airquality)中某兩個向 : 量(Ozone和Temp)分別大於31和90時的第三個向量Solar.R : 的平均值是多少? ```r attach(airquality) library(dplyr) filter(airquality, !is.na(Ozone), !is.na(Temp)) %>% filter(Ozone > 31, Temp > 90) %>% `[[`("Solar.R") %>% mean ``` 前兩行載入資料和dplyr。 dplyr對於表格化的物件,如: data.frame data.table (當資料量大的時候,好用的套件) SQL database 中的table 提供了一致的「動作」來作資料整理。 常用的有: 選行: select, 同SQL select 選列: filter, 同SQL where 排序: arrange, 同SQL sort by 取獨特值: distinct, 同SQL distinct 更動值: mutate, 同SQL update 總結: summarise (可搭配group_by使用,類似SQL group by) 這裡第三行 filter(airquality, !is.na(Ozone), !is.na(Temp)) 表示從airquality中取出Ozone和Temp不是NA的列出來 第三行最後面的`%>%`是magrittr套件(dplyr會自動幫你載入它) 導入的一種`pipeline`方式的寫法。 他的功能在於,把前面的輸出結果,放到下一個函數的第一個參數 舉例來說,原本我們要這樣寫: df1 <- filter(airquality, !is.na(Ozone), !is.na(Temp)) df2 <- filter(df1, Ozone > 31, Temp > 90) 懶惰的人如我,可能會寫成 filter(filter(airquality, !is.na(Ozone), !is.na(Temp)), Ozone > 31, Temp > 90) 這樣可以略過中間的暫存變數df1,但是程式碼也變醜了 透過`%>%`,我們可以把上面兩行改成: filter(airquality, !is.na(Ozone), !is.na(Temp)) %>% # df1 filter(Ozone > 31, Temp > 90) # filter(df1, ...) 不但可以略過暫存變數,同時程式碼仍然看起清楚 最後利用`%>%`和`[[`達到取出行變數Solar.R 再用mean算出平均值。 這裡順便跟大家宣導一個小概念: R 中所有的東西都是「函數」,包含airquality[["Solar.R"]]這種語法, 實際上是`[[`(airquality, "Solar.R") 利用這樣的概念,再搭配`%>%`的威力,程式碼就寫的更爽了 : 後來我有發現可以用: : attach(data) : sub <- subset(data,Ozone > 31 & Temp > 90) : summary(sub) : 的方式求出Solar.R在符合上述兩個條件之下的平均值。 : 但一開始只是直覺地想要用for loop暴力算,但沒成功, : 想問板上是否可以用迴圈的方式算出來?以下是自己嘗試 : 的程式碼,附帶一提: : data[,1]是Ozone : data[,2]是Solar.R : data[,4]是Temp : [程式範例]: : add <- 0 : count <- 0 : for(i in 1:153){ : if(data[i,1]>31 & data[i,4]>90) : add <- add + data[i,2] #把符合條件的Temp值累加 : count <- count + 1 : } : mean <- add/count : 這裏遇到的問題是data[,1]含有NA值,所以我想把有NA值 : 的資料刪掉,於是先跑這個for loop: : for(i in 1:153){ : if(is.na(hw2[i,1])) : hw2[i,] <- NULL : } : 結果: : 錯誤在`[<-.data.frame`(`*tmp*`, i, , value = NULL) : : replacement has 0 items, need 6 : 不知道是類型不一樣,NULL不能隨便套用還是其他原因, : 總之先感謝各位大大把這篇看完QQ --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.35.149
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1421156648.A.15C.html
1F:→ Wush978: https://www.youtube.com/watch?v=JD1eDxxrur0 01/13 21:45
2F:→ Wush978: 年會的影片有對dplyr做更詳細和更精彩的介紹FYI 01/13 21:45
3F:推 ntme: GOOD! 01/13 21:55
4F:推 cywhale: 推~今天剛好看到dplyr cheatsheet http://goo.gl/iXj4CN 01/13 22:07
5F:→ Wush978: 感謝提供cheatsheets,收入置底資源區 01/13 22:08
6F:推 memphis: 為什麼不使用 summarise(mean(Solar.R)) ? 01/13 22:11
7F:→ Wush978: 因為一時沒想到,謝謝補充。ps.兩種方式輸出的格式不同 01/13 22:27
8F:推 ToastCheng: 太感謝了~想不到還能多學兩招 01/13 22:55
9F:推 obarisk: 原po想玩迴圈,應該用cpp做範例的XD 01/13 23:00
10F:→ Wush978: 只好麻煩樓上了(推) 01/13 23:01
11F:→ obarisk: magrittr裡面有包一些取代[[的function 01/13 23:02
12F:推 mnhjlopi: 推 01/14 15:15
13F:推 squallscer: 好文章! 推 01/14 20:04
14F:推 nh2: 實用! 01/15 08:15
15F:推 hyekyo0608: 真的很感謝Wush大,總是說明得很清楚!推推推 07/06 17:02







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

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

TOP