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/cn.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灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP