师妹带你认识R数据处理之magrittr
{ 点击蓝字,关注我们 }
magrittr包是一个R语言包,提供了一些高效的管道操作工具包,可以简化代码,使得代码更加易读和易维护。管道操作符可以帮助我们将多个函数连接起来,将一个函数的输出作为另一个函数的输入。这样,我们就可以用一种更加直观的方式来表达数据处理的过程。
magrittr包中最常用的管道操作符是 %>%,它可以将左边的结果传递给右边的函数作为第一个参数,此包还避免了函数的嵌套,满足了最小化对局部变量和函数定义,是我们操作不同位置的序列更加方便快捷。那么接下来就由小师妹来介绍一下这个神奇的R包吧。
一
安装和载入
安装:install.packages("magrittr")
载入:library(magrittr)
二
操作
magrittr 主要包括 4 个管道操作符,分别为%>% 向右操作符,%T>% Tee 操作符,向左操作符,%$% 解释操作符,%<>% 复合赋值管道操作符,接下来小师妹一一演示他们的操作用法,跟小师妹一起学习来吧。
1.%>%
将左边的结果传递给右边的函数作为第一个参数值,其结果可以继续向右边传递。
(1)基本管道操作:x %>% f => f(x),x %>% f(y) => f(x, y),x %>% f %>% g %>% h => h(g(f(x)))
默认将 %>% 左边的 x 作为右边的(如 f 函数)的第一个参数,小师妹举个简单的例子:
> x <- 9
> f <- function(x, y=3) { return(x+y) }
> x %>% f
[1] 12
> x %>% f(2)
[1]11
(2)参数占位符:x %>% f(y, .) => f(y, x),x %>% f(y, z = .) => f(y, z = x)
使用 . 占位符,表示管道左边传过来的变量,小师妹举个简单的例子:
> x <- 9
> f <- function(x, y=3) { return(x+y) }
> x %>% f(y = .,x = 5)
[1]14
(3)对属性重用占位符:x %>% f(y = nrow(.), z = ncol(.)) => f(x, y = nrow(x), z = ncol(x))
在右侧表达式中可以多次使用占位符。但是,当占位符仅出现在嵌套表达式中时,magrittr 仍将应用第一个参数规则。因为在大多数情况下,这会产生更干净的代码。
可以通过将右侧表达式用大括号包裹来取消这一规则:x %>% {f(y = nrow(.), z = ncol(.))} => f(y = nrow(x), z = ncol(x))
接下来小师妹举个例子,小伙伴们来理解一下。
> x <- matrix(1:8, nrow = 2, ncol = 4)
> f<- function(x, y, z) { return(x * y * z) }
> x %>% f(y = nrow(.), z = ncol(.))
[,1] [,2] [,3] [,4]
[1,] 8 24 40 56
[2,] 16 32 48 64
> x %>% {f(y = nrow(.), z = ncol(.))}
Error in f(y = nrow(.), z = ncol(.)) :
argument "x" is missing, with no default
#这里报错是因为缺少参数"x"也没有缺省值。
> x %>% {f(1, y = nrow(.), z = ncol(.))}
[1]8
(4)绑定函数:任何以 . 开头的管道序列将会返回一个一元函数,也就是说f <- . %>% cos %>% sin 与f <- function(.) sin(cos(.)) 是相等的。
小师妹还是来举两个例子帮助大家理解。
举例1:传递到代码块
> rnorm(5) %>% multiply_by(3) %>% add(2) %>%
+ {
+ print("Mean:", mean(.))
+ sort(.) %>% head(3)
+ }
[1] "Mean:"
[1] -1.600125694 -0.003594282 2.892074260
举例2:传递到函数
> rnorm(5) %>% add(1) %>% `*`(5) %>%(
+ function(x) {
+ if (x[1] > 5) {
+ x-5
+ } else x
+ }
+ )
[1] 1.159504 6.172372 2.371457 9.932066 -7.305487
2. %T>%
与 %>% 的区别是其结果不能向右传递,而是将 %T>% 左边的结果继续向右传递下去,%T>% 通常用来输出图形、打印结果到屏幕或者输出到文件,然后继续后面的 %>% 操作而其左边的值相当于做了两次传递,分别传递给 %T>% 右侧表达式以及其后面的 %>% 管道符的右侧表达式。小师妹还是给大家举例来帮助大家理解掌握。
> a <- 3
> a %>% cos %T>% print %>% sin
[1] -0.9899925
[1] -0.8360219
> x %>% cos %T>% hist %>% sin
[,1] [,2] [,3] [,4]
[1,] 0.5143953 -0.8360219 0.2798734 0.6844888
[2,] -0.4042392 -0.6080830 0.8192892 -0.1449872
3. %$%
通常左边是数据框,%$% 右边的函数可直接使用该数据框中的变量,请小伙伴们观察下面例子。
> x <- matrix(1:12, nrow = 3, ncol = 4)
> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(x > 5),]
[1] x y z
<0 行> (或0-长度的row.names)
> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(y > 5),]
x y z
3 3 6 9
小伙伴们是否发现他就等于:
> df <- data.frame(x=x[,1], y=x[,2], z=x[,3])
> df[which(df$y>5),]
x y z
3 3 6 9
4.%<>%
只能出现在所有管道符的第一个,用于在一长串处理管道操作之后直接将值赋值到最左边的对象上,小师妹还是举个简单的例子哈。
> a <- 1:5
> print(a)
1 2 3 4 5
> a %<>% exp %>% sqrt
> print(a)
[1] 1.648721 2.718282 4.481689 7.389056 12.182494
怎么样,大家跟着小师妹的步伐是不是觉得学到很多东西呢,magrittr包的讲解今天就到这啦,如果有其他问题,欢迎小伙伴们随时与小师妹讨论哦,下次再会啦。