作者joson4921 (特务)
看板R_Language
标题[问题] 对group_by後的资料使用filter过滤
时间Sat Nov 19 17:04:57 2016
文章分类提示:
- 问题: 当你想要问问题时,请使用这个类别
[问题类型]:
程式谘询(我想用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://webptt.com/cn.aspx?n=bbs/R_Language/M.1479546303.A.C7A.html
1F:→ celestialgod: 第二段程式码 完全看不懂 a <- b %>% c <- d %>% 11/19 19:03
2F:→ celestialgod: 这到底是什麽语法? 11/19 19:03
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 算不出来
3F:→ celestialgod: 没有这种与法拉qq 11/19 19:56
4F:→ celestialgod: %>% 要有接函数... 你下一行又是一行assign... 11/19 19:56
5F:→ celestialgod: 当然会assign 失败 11/19 19:56
痾那我这边应该要怎麽个打法才能跑出我想要的结果呢?..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
6F:→ celestialgod: 这个错误很明显来自你的type这个变数没有被assign 11/19 21:09
7F:→ joson4921: 好的,我再去找找看怎麽解 11/19 22:04
8F:→ joson4921: 感谢 11/19 22:04
9F:→ cywhale: 你是想写dt1<-type %>% mutate(QL=quantile(Time_OnStop, 11/20 00:14
10F:→ cywhale: probs=0.25)) %>% mutate(QU = quantile(Time_OnStop, 11/20 00:15
11F:推 cywhale: probs=0.75)) 直接在分群好的资料mutate新变数QL, QU即可 11/20 00:18
12F:→ joson4921: 谢谢,用了mutate去跑并修正filter之後有跑出我要的结果 11/20 09:30
13F:→ joson4921: 了,感谢两位c大大的协助!!! 11/20 09:31