来源 | R友舍
1,R Coder的福音
Magrittr包实现了UNIX下的流式操作,即在R的编程环境下,也可以实现UNIX下的|
管道符的操作,如下:
`> iris[,1:4] %>%
colSums`
得到如下结果:
Sepal.Length Sepal.Width Petal.Length Petal.Width 876.5 458.6 563.7 179.9
管道操作真的减少了代码量,节省时间,对于R CODER来说一个福音。再也不用没操作一次就赋值一个变量了。
2,下面简单介绍四种常用的管道操作:
%>%
:常用的管道操作就是
%>%
了,见上面的例子。它的作用就是把当前操作的结果,传递给下一步,然后继续操作,继续传递……这个基本满足60%的R CODER的需求了吧。
%$%
:当然,在特殊的情况下,比如生成新的变量,下一个操作需要用到变量的name,需要把这个变量传递下去,则需要
%$%
;比如:
data.frame(z = rnorm(100)) %$% ts.plot(z)
,这个地方,ts.plot()
需要使用z
这个name,所以需要把它传递下去,如果用%>%
则不能实现这个功能。
%T%
:在更特殊的情况下,比如Plot等函数不能产生数据的结果,比如在
a->plot->c
过程中,plot不传递数据给c,但是我们还想在C用a的数据,怎么办?这个时候下,就需要
%T>%
的操作符,如下:rnorm(200) %>% matrix(ncol = 2) %T>% plot %>% # plot usually does not return anything. colSums
%<>%
:还有一种,是左边的数据可以被更新,如下:
x <- rnorm(100) x %<>% abs %>% sort
,从这个可以看到,x
是经过了abs
和sort
之后的,最后的结果是排序后正的随机数。
3,管道操作后数据的调用
除%T>%
和%$%
可以使用变量以外,%>%
之后的数据使用也很重要。使用.
(dot)作为变量使用,比较方便,如下:
x %>% f is equivalent to f(x)
:x %>% f(y) is equivalent to f(x, y)
:y %>% f(x, .) is equivalent to f(x, y) and z %>% f(x, y, arg = .) is equivalent to f(x, y, arg = z)
:1:10 %>% {c(min(.), max(.))} is equivalent to c(min(1:10), max(1:10)).
:a %>% (function(x) x^2), and 1:10 %>% (call("sum"))
还可以直接赋值新变量,比如
iris[1:4,] %>% { my_data <- . colSums(my_data) }
有了上述介绍的管道操作功能,基本就可以满足日常的数据的处理了。