R_Language 板


LINE

本章是最後一章,主要介紹 1. data.table:::dcast.data.table 2. data.table:::melt 3. tidyr:::gather 4. tidyr:::spread 5. tidyr:::separate 這一章主要講述注重在資料的呈現方式 - 橫表跟直表的呈現 還有一些表格整合的問題 1. dcast.data.table dcast提供直表加總的函數 學過統計的話,應該是contingency table (列聯表) 或是熟悉EXCEL,知道樞紐分析表,它其實就是樞紐分析表 Y就是列聯表中的列變數,X就是行變數 製作列聯表也可以說它的應用之一 這個function,需要先`require(reshape2)` 有人可能會問reshape2就有dcast為啥要用dcast.data.table 原因很簡單,因為dcast.data.table快更多!! 速度直接?dcast.data.table下面例子就有,直接來簡介怎麼用 第一個input是data.table,第二個是給一個公式 舉例來說,如果公式是 Y ~ X,Y的元素會展開在列,X就會在行 第三個input是加總函數,你如果有相同類別的X, Y 它會把相同類別的值用這個函數做加總,預設是length 先用一個簡單例子來說明 ` R set.seed(100) DT = expand.grid(LETTERS[1:2], LETTERS[3:4]) %>% data.table %>% setnames(c("col1","col2")) %>% '['(rep(1:nrow(.), 2)) %>% '['(,values := rpois(8,2)) DT # col1 col2 values # 1: A C 1 # 2: B C 1 # 3: A D 2 # 4: B D 0 # 5: A C 2 # 6: B C 2 # 7: A D 3 # 8: B D 1 dcast.data.table(DT, col1~col2) # col1 C D # 1: A 2 2 # 2: B 2 2 dcast.data.table(DT, col1~col2, sum) # col1 C D # 1: A 3 5 # 2: B 3 1 ` 產生資料的函數、operator,我們都講過了,往前找找看 我們專注到第一個dcast,dcast.data.table(DT, col1~col2) 可以看的出來 col1就在列,col2就在行展開,然後計算col1, col2有相同類別的length 第二個dcast就是把有相同的類別,把values做總和 但是,我們怎麼知道它加總的是values 它會告訴你自動找尋data.table,然後選定values做為加總的column 至於改法就是修改value.var這個input,舉例來說 ` R DT[, values2 := rpois(8, 3)] dcast.data.table(DT, col1~col2, sum, value.var = "values") # col1 C D # 1: A 3 5 # 2: B 3 1 dcast.data.table(DT, col1~col2, sum, value.var = "values2") # col1 C D # 1: A 5 7 # 2: B 3 9 DT[, col3 := rep(LETTERS[5:6],,,4)] dcast.data.table(DT, col1+col2~col3, sum, value.var = "values") # col1 col2 E F # 1: A C 1 2 # 2: A D 2 3 # 3: B C 1 2 # 4: B D 0 1 ` dcast.data.table說明到此 2. melt dcast做直表加總,melt做橫表轉直表 舉個簡單的例子 我們有數個病人,每個病人有數個觀察值 表格紀錄的樣子是 id O1 O2 P1 12 18 P2 13 15 .. .. .. 我們想要轉成直表長這樣: id O V P1 O1 12 P1 O1 18 P2 O2 13 P2 O2 15 .. .. .. 那麼在R code可以這樣做: ` R (DT = data.table(id = paste0("P", 1:2), O1 = c(12,13), O2 = c(18,15))) # id O1 O2 # 1: P1 12 18 # 2: P2 13 15 (DT_long = melt(DT, "id", variable.name = "O", value.name = "V")) # id O V # 1: P1 O1 12 # 2: P2 O1 13 # 3: P1 O2 18 # 4: P2 O2 15 ` melt的第一個input是data.table (註一) 第二個input是id.vars,也就是你要展開的變數名稱 第三個input是measure.vars,你要展開的變數名稱 前面例子未指定的情況下,就是全部的column 前面我還有用到variable.name 跟 value.name variable.name是指定集合其他columns之後的column name 在前例就是把 O1, O2兩個columns集合之後的變數名稱,我改成了"O" value.name是你集合其他columns之後那些變數值的column 在前例就是把 O1, O2兩個columns集合之後的變數值,我改成了"V" 註一:此指data.table:::melt,跟reshape2:::melt的差異部分 請看data.table:::melt的help 我們再看一個複雜一點的例子 ` R DT = data.table(ID1 = paste0("ID1_", 1:20), ID2 = sample(paste0("ID2_", 1:20)), O1 = rnorm(20), O2 = rnorm(20), O3 = rnorm(20)) ## 以ID1跟ID2作為展開,其他column (O1 ~ O3)會疊成一個變數 ## 還會有一個新類別去label後面的value來自哪一個變數 melt(DT, c("ID1", "ID2"), c("O1", "O2", "O3"), variable.name = "O", value.name = "V") ## 以ID1作為展開,其他column (O1 ~ O3)會疊成一個變數 ## 還會有一個新類別去label後面的value來自哪一個變數 melt(DT, "ID1", c("O1", "O2", "O3"), variable.name = "O", value.name = "V") ## 以ID1作為展開,其他column (O1 ~ O2)會疊成一個變數 ## 還會有一個新類別去label後面的value來自哪一個變數 melt(DT, "ID1", c("O1", "O2"), variable.name = "O", value.name = "V") ` 3. gather 其實就是melt,只是比較好寫 我們把melt的例子改成用gather寫 只是melt一次到位的指令用gather寫之後 要用select跟filter做 (但是我覺得gather比較好寫) ` R (DT = data.table(id = paste0("P", 1:2), O1 = c(12,13), O2 = c(18,15))) # id O1 O2 # 1: P1 12 18 # 2: P2 13 15 (DT_long = gather(DT, O, V, -id)) # id O V # 1: P1 O1 12 # 2: P2 O1 13 # 3: P1 O2 18 # 4: P2 O2 15 DT = data.table(ID1 = paste0("ID1_", 1:20), ID2 = sample(paste0("ID2_", 1:20)), O1 = rnorm(20), O2 = rnorm(20), O3 = rnorm(20)) gather(DT, O, V, -ID1, -ID2) gather(DT, O, V, -ID1, -ID2) %>% select(-ID2) gather(DT, O, V, -ID1, -ID2) %>% select(-ID2) %>% filter(O!="O3") ` 4. spread 提供gather的反向操作 ` R DT = data.table(id = paste0("P", 1:2), O1 = c(12,13), O2 = c(18,15)) DT_long = gather(DT, O, V, -id) DT_long %>% spread(O, V) # id O1 O2 # 1: P1 12 18 # 2: P2 13 15 ` 5. separate 把特定column做strsplit,並設定成新的變數 一個簡單的例子 ` R DT = data.table(x = paste0(sample(LETTERS, 5), ",", sample(LETTERS, 5))) DT %>% separate(x, paste0("V", 1:2)) ` 這個函數要注意的是以下的程式是會出現錯誤的 ` R DT = data.table(x = paste0(sample(LETTERS, 5), sample(LETTERS, 5))) DT %>% separate(x, paste0("V", 1:2)) ` separate無法分開沒有間隔字元的字串 你要分開這個只能做適當的轉換,像是: ` R DT = data.table(x = paste0(sample(LETTERS, 5), sample(LETTERS, 5))) DT %<>% mutate(x = gsub("([A-Z])", "\\1, ", x)) DT %>% separate(x, paste0("V", 1:3)) %>% select(-V3) ` 如果有人有更好的方法,麻煩告知我一下,謝謝 資料介紹套件就到這裡結束 有任何問題,歡迎在板上回文詢問,我有看到都會回覆 (麻煩盡量不要用私信,希望可以讓板眾一起看問題該怎麼解決) 有任何補充或是建議也歡迎推文或回文,感謝大家 我並沒有講到plyr的 a*ply, l*ply, d*ply, r*ply系列 其實他們跟apply, lapply, tapply, replicate相對應,只是output型式不同 如果未來有機會寫有關*ply系列函數時,我再好好介紹plyr [關鍵字]: tidyr --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.27.107
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1437813750.A.05B.html ※ 編輯: celestialgod (123.205.27.107), 07/25/2015 16:53:10
1F:推 andrew43: 快拜一下。 07/25 22:29
2F:推 psinqoo: 朝聖~ 07/26 08:51
3F:推 hyekyo0608: 跟著拜~ 07/27 09:49
4F:推 squallscer: 朝聖~ 07/27 20:14
5F:推 sacidoO: 有看有推 感謝C大分享寶貴經驗! 06/14 13:39







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

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

TOP