师妹带你认识R数据处理之magrittr






师妹带你认识R数据处理之magrittr

小师妹  生信果  2023-07-04 19:00:29

{ 点击蓝字,关注我们 }

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 z3 3 6 9

小伙伴们是否发现他就等于:

> df <- data.frame(x=x[,1], y=x[,2], z=x[,3])> df[which(df$y>5),]  x y z3 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包的讲解今天就到这啦,如果有其他问题,欢迎小伙伴们随时与小师妹讨论哦,下次再会啦。