R_Language 板


LINE

鉴於andrew大大的提议,现下刚好有闲就来写一系列资料整理套件的文章 版上比我熟这些套件的人也不少,如果不足的部分,再麻烦帮忙补充 目前想要介绍的套件有 (後面列一些我常用的function) - magrittr : pipe operator如 '%>%', '%<>%', '%T>%', '%$%' - data.table: class 'data.table', dcast.data.table, melt, fread, duplicated, transform, rbindlist, merge - reshape2 : dcast, melt (required for data.table) - plyr : name_rows, colwise, mapvalues - dplyr : mutate, summarise, arrange, filter, distinct, group_by, n, select, rowwise, tbl_dt, mutate_each, summarise_each - tidyr : gather, separate, spread 这篇的重点放在 magrittr,因为後面我会大量使用pipe operator来写程式码 我尽量每一个operator用简单一点的方式说明,如果不太了解再麻烦告知 程式码部分,我都会用` R 跟 ` 做引号 1. '%>%' 这个operator用来传递数值,避免过多的nest造成阅读上的困难 像是 a_list = list(1:6, 3:5, 4:7) lapply(a_list, function(x) setdiff(sort(unique(unlist(a_list))), x)) 第二行拆解阅读是很困难的,但是写成 a_list %>% unlist %>% unique %>% sort %>% { lapply(a_list, setdiff, x = .) } 阅读上会容易很多 举一个简单的例子,来说明 '%>%'的用法 ` R a = 1 f = function(a) a + 1 f(a) a %>% f a %>% f() a %>% f(.) ` 跑上面的程式可以发现,最後四个output都一样 其实 %>% 做的就是把 左边变数 放进 右边函数里做执行 也就是说 f(a) 等同於 a %>% f (或是上面其他三种) 另外,可能会觉得 `a %>% f(.)`会很奇怪 在magrittr中, `.`就是用来代表%>%前面的变数 所以 a %>% f(.) 程式会把.的位置换成a,变成 f(a) `.` 在magrittr的应用中,会占很大的比例 像是do.call, Reduce第一个input是function,第二个是list 我们通常传入list,所以此时必须用 . 做位置的控制 再者,c, cbind, rbind会根据位置不同来决定是合并於何处 也是一个很重要的问题,因此,用 `.`做传入位置的控制是必须的 针对这个,我给一段简单的程式码让你去试试看 ` R a_list = list(1:5, 3:7, 6:10) a_list %>% do.call(rbind, .) a_list %>% Reduce(cbind, .) 1:5 %>% rbind(3:7, .) 1:5 %>% rbind(., 3:7) f = function(x, a, b) a*x^2 + b 1:5 %>% f(., 2, 5) # 同 1:5 %>% f(2, 5) 1:5 %>% f(2, ., 5) 1:5 %>% f(2, 5, .) ` 再者,%>% 也可以传入一个block (用{}括住的部分) 像是前面提到的 ` R a_list = list(1:6, 3:5, 4:7) a_list %>% unlist %>% unique %>% sort %>% { lapply(a_list, setdiff, x = .) } ` 先说明怎麽阅读 %>%的部分 a_list %>% unlist %>% unique %>% sort 就是 a_list把全部元素合并(unlist),然後取唯一(unique),接着排列所有元素(sort) 就照着%>%的顺序去读就可以顺利解读 再来就是block的部分 {}括住之後,里面的只要不是其他%>%後面的 `.`都代表你前面传入的值 这样很难懂,举个例子 ` R 1:2 %>% { list( cbind(9:10, .), 3:4 %>% cbind(9:10, .) ) } ` output长这样 [[1]] . [1,] 9 1 [2,] 10 2 [[2]] . [1,] 9 3 [2,] 10 4 可以看到第一个可以很直觉的解读,9:10是跟传入的1:2做行合并 而第二个`.`,因为前面有了一个新的 '%>%' 所以这一个`.`就被前面的 3:4取代 所以第二个output变成9:10跟3:4做行合并 2. '%<>%' 如果懂了 %>%, 这个就不难了 先看简单的例子 (add是magrittr提供用在 %>%上的 `+` (这部分请看最後面的补充)) ` R a = 1 a %>% add(1) # 同 a %>% '+'(1) or a %>% '+'(., 1) a # 1 a %<>% add(1) a # 2 ` 这个例子可以看的出来 %<>% 除了传入变数之外,也会改变传入变数的值 也就是可以把 a %<>% add(1) 看成 a = a + 1 你如果有一串要做最後赋值给你传入的变数 只需要在第一个传导变数的operator做改变即可,举例来说: ` R dat = data.frame(a = 1:3, b = 8:10) dat = dat %>% rbind(dat) dat2 = data.frame(a = 1:3, b = 8:10) dat2 %<>% rbind(dat2) all.eqaul(dat, dat2) # TRUE ` 3. '%T>%' %T>% 只传递变数,不回传值,通常用来传递到不回传值的function上 像是plot, library, install.packages, plyr的 *_ply等 这个operator可以帮你把前面做好的值赋予一个变数 并且同时做後面function的动作,举例来说: ` R dat = data.frame(a = rep(1:3,2), b = rnorm(6)) dat2 = dat %>% {tapply(.$b, .$a, sum)} %>% { data.frame(a=names(.) %>% as.integer, b = .) } %T>% plot(.$a, .$b) ` 这里dat2就是一个新的data.frame,同时,我们也把a, b的scatter plot画出来 这部分可以用dplyr的group_by以及summarise完成 还没提到dplyr,所以我们先用替代方法做 这里顺便把第四个operator '%$%'一起说明 dat %>% {tapply(.$b, .$a, sum)} 会不会觉得很冗长,也很容易忘记要放'.$' 但是,'%$%'提供了直接把前面变数的元素 直接以名字做操作 再也不需要 .$name这麽麻烦,直接用 name做你想要的操作就好 因此,那行就可以简单写成 dat %$% tapply(b, a, sum) 是不是就变得简单的很多? 4. '%$%' 前面提到了,这里就给一个例子就好 ` R a = 3 b = -2 x = rnorm(100) y = a + b * x + rnorm(100) fit = lm(y ~ x) sigma_hat = fit %$% {crossprod(residuals) / df.residual} ` 下一章应该会介绍data.table跟reshape2,後会有期。 补充: magrittr提供很多其他function的别名 像是 '+', '*', '[', '[[', '<- rownames()'等等 有兴趣请去magrittr的manual查看extract的部分 这个可以让你写pipe chain的时候更加顺手 像是 vals = 1:3 %>% data.frame(a = ., b = .^2) %>% set_rownames(LETTERS[1:3]) %>% lm(b ~ a, data = .) %>% predict 不然你可能会这样写 dat = 1:3 %>% data.frame(a = ., b = .^2) rownames(dat) = LETTERS[1:3] vals = dat %>% lm(b ~ a, data = .) %>% predict 你可能只是要vals这个变数,你却还要多创一个dat这个暂存变数,而中断chain [关键字]: magrittr --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.205.27.107
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1437452331.A.CD1.html
1F:推 andrew43: 写得极好。 07/21 12:39
2F:推 cywhale: 收藏 这麽详细别处找不到 甘温~ 07/21 12:47
3F:推 ardodo: 好清楚,感谢分享 07/21 13:04
4F:推 Edster: 看来我要好好来研究magrittr,从没认真看它的用途。 07/21 14:20
5F:推 MADNUG: 真是太感谢了! 07/21 15:36
6F:推 maninblue: 推~ 07/21 16:41
7F:推 TunTunTun: 推~ 07/21 20:38
8F:推 spiderway: 推了 找时间详读 07/21 23:38
9F:推 allen1985: 推 等等来好好学一下 07/22 04:30
10F:推 fifish89: 推推~ 07/22 10:11
11F:推 bedark: 推~ 07/22 11:11
12F:推 ljta: 厉害,写得相当清楚。 07/22 11:27
13F:推 SeaSprite: bloody awesome post! 07/23 05:37
14F:推 nh2: 感谢 07/24 13:06
15F:推 sacidoO: 好文 谢谢C大分享 08/12 12:55
16F:推 h310713: 真是高手 细细品尝 08/19 00:56
17F:推 LinNine: 推~~~ 11/01 01:15
※ 编辑: celestialgod (140.109.74.87), 12/31/2015 13:06:30
18F:推 spirit1990: 收获推 07/02 18:42
19F:推 swilly0906: 帮推 学到好多~~ 08/14 17:43
20F:推 mosenay: 推 04/23 10:26
21F:推 oliversu1211: 推 06/23 23:36







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