[問題] 對group_by後的資料使用filter過濾

看板R_Language作者 (特務)時間9年前 (2016/11/19 17:05), 9年前編輯推噓1(1012)
留言13則, 3人參與, 最新討論串1/1
文章分類提示: - 問題: 當你想要問問題時,請使用這個類別 [問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: *[m 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 手上有一組資料叫作OnStop_TT(csv檔:https://goo.gl/uneVoZ) 想選取其中的Time_frame(5-22時)/Goback(去&返程)/NameZh(單程25站)等三個欄位 以group_by作分類,分類結果為 符合對應Time_frame/Goback/NameZh底下皆有數十筆不等之Time_OnStop(停靠時間) 再以summarise取出停靠時間最小值,然後用arrange依Time_OnStop大小排序輸出 以下程式碼參考網路上有的並加以修改如下: =============================================================== #初始化 type 儲存分類後的 OnStop_TT 資料 type <- OnStop_TT %>% #選取Time_frame, Goback, NameZh等三欄位作為分類數據的依據 group_by(Time_frame,Goback,NameZh) %>% summarise(Time_OnStop = min(Time_OnStop)) %>% arrange(desc(Time_OnStop)) =============================================================== 到這邊為止都OK也能跑出我要的結果. 但我想做的是在summarise取最小值之前,先行排除停靠時間過小的資料: →比「盒鬚法下緣(令此數為 QL )減1.5倍 IQR」還要小的資料視為異常值刪除 之後再對每一組分類結果底下的停靠時間資料作處理: 因為不會寫所以copy網路上找到的程式碼並修改如下: =============================================================== #初始化盒鬚法上下緣分別為 QU 和QL, IQR值為QU-QL QL <- quantile( type, probs=0.25) %>% QU <- quantile( type, probs=0.75) %>% QU_QL <- QU-QL %>% QL %>% QU %>% QU_QL %>% #鎖定小於下四分位數的數值( Time_OnStop < QL-1.5*IQR 的資料視為異常值) which(type < QL-1.5*QU_QL) %>% type[which(type < QL-1.5*QU_QL)] %>% #移除小於 下緣QL減去1.5倍IQR 的資料列 #然後取最小值 filter( type, Time_OnStop < (QL-1.5*QU_QL)) %>% summarise(Time_OnStop = min(Time_OnStop)) %>% arrange(desc(Time_OnStop)) =============================================================== 錯誤代碼,疑似QU沒有成功初始化:Error: object 'QU' not found 弄了快一星期還是找不到問題出在哪,請求板上大神協助 感謝大家 [環境敘述]: 請提供 sessionInfo() 的輸出結果, 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊, 讓版友更容易找出錯誤 [關鍵字]: 選擇性,也許未來有用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.161.171.149 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1479546303.A.C7A.html

11/19 19:03, , 1F
第二段程式碼 完全看不懂 a <- b %>% c <- d %>%
11/19 19:03, 1F

11/19 19:03, , 2F
這到底是什麼語法?
11/19 19:03, 2F
QL <- quantile( type, probs=0.25) %>% QU <- quantile( type, probs=0.75) %>% 我的想法是用 quantile 函數去抓出前面 group_by 出來的每一組數據排序25%跟75%的值 用25%和75%的值當做lowerbound跟upperbound,分別指定給 QL 和 QU 再用 QL 跟 QU 去算IQR,但是不知道為什麼console一直顯示錯誤, QL 跟 QU 算不出來

11/19 19:56, , 3F
沒有這種與法拉qq
11/19 19:56, 3F

11/19 19:56, , 4F
%>% 要有接函數... 你下一行又是一行assign...
11/19 19:56, 4F

11/19 19:56, , 5F
當然會assign 失敗
11/19 19:56, 5F
痾那我這邊應該要怎麼個打法才能跑出我想要的結果呢?..0.0 因為初始化 QL 和 QU 要根據group_by出來的結果 所以我就想說把 QL 跟 QU 的初始化擺在group_by後面 但這樣子程式會出現錯誤: >Error in quantile(type, probs = 0.25) : object 'type' not found 所以我就在QL和QU後面通通加上 %>% ,但這樣一搞就變成後面出錯了 現在處於一個不知道哪裡出問題的狀態,煩請大神指點迷津,感謝 PS.一開始我是第一段程式碼先group_by出分類結果 然後想說第二段程式碼是根據第一段的分類結果 所以我就把第二段程式碼安插在第一段的group_by跟summarize中間 我的想法是這樣,但我不知道這樣的邏輯對不對,還請不吝指正,感謝!!! ※ 編輯: joson4921 (1.161.171.149), 11/19/2016 20:11:36

11/19 21:09, , 6F
這個錯誤很明顯來自你的type這個變數沒有被assign
11/19 21:09, 6F

11/19 22:04, , 7F
好的,我再去找找看怎麼解
11/19 22:04, 7F

11/19 22:04, , 8F
感謝
11/19 22:04, 8F

11/20 00:14, , 9F
你是想寫dt1<-type %>% mutate(QL=quantile(Time_OnStop,
11/20 00:14, 9F

11/20 00:15, , 10F
probs=0.25)) %>% mutate(QU = quantile(Time_OnStop,
11/20 00:15, 10F

11/20 00:18, , 11F
probs=0.75)) 直接在分群好的資料mutate新變數QL, QU即可
11/20 00:18, 11F

11/20 09:30, , 12F
謝謝,用了mutate去跑並修正filter之後有跑出我要的結果
11/20 09:30, 12F

11/20 09:31, , 13F
了,感謝兩位c大大的協助!!!
11/20 09:31, 13F
文章代碼(AID): #1OC1M_nw (R_Language)
文章代碼(AID): #1OC1M_nw (R_Language)