写在最前:
- 熟悉Linux的同学应该都惊叹过管道操作符
|的美妙之处。感受一下:awk -F ',' '{print $2}' xxx.csv | sort | uniq -c | sort -rn | head -n 50 > top50.txt- magrittr包实现了类似的功能,使用
%>%函数来进行管道操作,搭配dplyr包中的函数,堪称完美!
使用管道操作的优点:
- 不用创建太多无用的中间变量,毕竟起名困难
- 方便阅读,代码显得更加优雅
我们使用一个ggplot2内置的diamonds数据集来感受一下。首先加载需要的包,然后看看数据集里有什么?
library(magrittr) #管道操作
library(dplyr) #数据框的行列处理
library(ggplot2) #画图
diamonds <- ggplot2::diamonds
print(diamonds, n=5, width = Inf)
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
4 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
# ... with 53,935 more rows
# i Use `print(n = ...)` to see more rows
可以看出,diamonds数据集记录了50,000多颗钻石的价格和一些属性,如:重量、切割质量、钻石色、清晰度等。
如果我想统计一下最完美切割的钻石,钻石色的分布,就可以进行以下操作:
IdealCutDiamonds <- diamonds %>%
filter(cut == "Ideal") %>%
group_by(color) %>%
count()
IdealCutDiamonds
# A tibble: 7 x 2
# Groups: color [7]
color n
<ord> <int>
1 D 2834
2 E 3903
3 F 3826
4 G 4884
5 H 3115
6 I 2093
7 J 896
我不说,你应该也看得出来其中的逻辑吧~(之后会出一期专门介绍dplyr包最常用且好用的函数)
不常用1:%T>%
除了%>%,magrittr包还有一些不太常用[就没用过]的管道操作符,如%T>%
#没有使用%T>%
rnorm(100) %>%
matrix(ncol = 2) %>%
plot() %>%
str()
NULL
#使用%T>%
rnorm(100) %>%
matrix(ncol = 2) %T>%
plot() %>%
str()
num [1:50, 1:2] -0.387 -0.785 -1.057 -0.796 -1.756 ...
一般画图函数不太会有什么输出,而%T>%像一个"T型"三通管道将数据传给了plot()和str()
不常用2:%$%
有时候操作符后面的函数输入需要一个或多个向量,而不是数据框,就可以使用%$%把向量"炸"出来。当然,使用df$colname也是可以的
#"爆炸"操作符%$%
mtcars %$% cor(disp,mpg)
#等价于
cor(mtcars$disp,mtcars$mpg)
不常用3:%<>%
用于简写%>%。
我不是很喜欢这个操作符,因为我认为赋值是一种非常特殊的操作,如果需要进行赋值,那么就应该使赋值语句尽量清晰,一点点小的重复是必要的,它可以更加明确的表示出赋值语句。
——Hadley Wickham
mtcars <- mtcars %>%
transform(cyl = cyl * 2)
#等价于
mtcars %<>% transform(cyl = cyl * 2)