R中的管道操作符%>%

写在最前:
  • 熟悉Linux的同学应该都惊叹过管道操作符|的美妙之处。感受一下:
  • awk -F ',' '{print $2}' xxx.csv | sort | uniq -c | sort -rn | head -n 50 > top50.txt
  • magrittr包实现了类似的功能,使用%>%函数来进行管道操作,搭配dplyr包中的函数,堪称完美!

使用管道操作的优点:

  1. 不用创建太多无用的中间变量,毕竟起名困难
  2. 方便阅读,代码显得更加优雅

  我们使用一个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)

内容参考:R for Data Science,近两年年度最爱之一,强烈推荐!!!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容