dplyr-cli:在Linux Terminal上直接执行dplyr

熟悉R的朋友都会知道,dplyr包是对原始的数据集进行清洗、整理以及变换的有力武器之一。但是其使用会局限于你需要有打开R/R studio或者通过R脚本来执行dplyr。对于这个问题,今天即将需要介绍的dplyr-cli就能很好的解决这个问题。

dplyr包的介绍

首先再和大家简单介绍一下dplyr包(避免有些刚入门的朋友可能不熟悉)。

dplyr包是 Hadley Wickham (ggplot2包,各种R语言书籍的作者,被称作“一个改变R的人”)的杰作, 并自称 a grammar of data manipulation, 他将原本plyr 包中的ddply()等函数进一步分离强化,专注接受dataframe对象, 大幅提高了速度, 并且提供了更稳健的与其它数据库对象间的接口。

dplyr包的功能主要包括:

  • 变量筛选函数 select
  • 筛选函数 filter
  • 排序函数 arrange
  • 变形(计算)函数 mutate
  • 汇总函数 summarize
  • 分组函数 group_by
  • 多步操作连接符 %>%
  • 随机抽样函数 sample_n,sample_frac

dplyr-cli的介绍

了解完dplyr包之后,就要介绍咱们这个推文的主角了dplyr-clidplyr-cli设计的初衷就是让我们能够方便快速的在不打开R的情况下,在命令行中运行dplyr,处理csv的文件。

目前dply-cli支持任何形式的dplyr::verb(.data, code)或者dplyr::*_join(.data, .rhs)命令。另外支持两个额外的命令,它们并不是原始dplyrR包的一部分。

  • csv 不执行dplyr命令,仅将输入数据作为CSV输出到stdout
  • kable不执行dplyr命令,而仅将输入数据作为 knitr::kable()格式字符串输出到stdout

其工作原理:dplyr-cli使用{ littler }在终端中的CSV文件上运行dplyr命令。

什么是littler?
littler命令行前端由“ r”(又称“轻量”)提供,作为围绕GNU R语言和统计计算和图形环境的轻量级二进制包装器。尽管R可以在批处理模式下使用,但r二进制文件完全支持'shebang'样式的脚本(即在脚本的第一行中使用hash-mark-exclamation-path表达式)以及在标准Unix管道。换句话说,该工具提供了无环境的R语言。

另外一个很友善的功能是,dplyr-cli使用终端管道|运行命令。

目前的不足:

  • 仅在OSXYMMV的bash下测试过
  • 每个命令的实质是在单独的R中运行

安装

虽然dply-cli是可以直接在命令行中直接使用,但是其执行时候还是会依赖到R包。所以首先让我们先把他们安装好:

install.packages('littler')  # Scripting front-end for R
install.packages('glue')     # text manipulation
install.packages('dplyr')    # data manipulation
install.packages('docopt')   # CLI description language

安装好R包后就是到Github中将dply-cli将其shell脚本下载好,并且放到合适的path中来执行:

git clone https://github.com/coolbutuseless/dplyr-cli
cp dplyr-cli/dplyr ./somewhere/in/your/search/path

工具使用

安装好工具第一件事当然是看看帮助文档:

./dplyr --help

Warning message:
package ‘dplyr’ was built under R version 3.5.2
dplyr-cli

Usage:
    dplyr <command> [--file=fn] [--csv | -c] [--verbose | -v] [<code>...]
    dplyr -h | --help

Options:
    -h --help            show this help text
    -f FILE --file=FILE  input CSV or RDS filename. If reading from stdin, assumes CSV [default: stdin]
    -c --csv             write output to stdout in CSV format (instead of default RDS file)
    -v --verbose         be verbose

和R一样,帮助文档首先告诉你当前的 ‘dplyr’的版本,然后一系列执行的参数。

接着我们就通过一系列的实战例子来了解一下如何使用这个好用的工具,这里会使用到mtcars.csv这个文件,当你从Github下载dplyr-cli时,会包含其作为一个测试文件:

例子一:简单的基本操作

输出mpg值为21的行:

##这里的 -c选项是用于输出格式为CSV的stdout
cat mtcars.csv | ./dplyr filter -c "mpg == 21"

###输出
"mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"
21,6,160,110,3.9,2.62,16.46,0,1,4,4
21,6,160,110,3.9,2.875,17.02,0,1,4,4

再让我试一试输出mpg的值小于11的行:

cat mtcars.csv | ./dplyr filter -c "mpg < 11"

###结果
"mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"
10.4,8,472,205,2.93,5.25,17.98,0,0,3,4
10.4,8,460,215,3,5.424,17.82,0,0,3,4

选择名为cyl的例,并输出前6行:

./dplyr select --file mtcars.csv -c cyl | head -n 6

实例二:多个数据处理的参数的结合

创建名为cyl2的新一列,它的值为cyl的两倍,再提取cyl值为8的行,最后使用kable参数,在terminal输出类似表格的结果

cat mtcars.csv | \
   ./dplyr mutate "cyl2 = 2 * cyl"  | \
   ./dplyr filter "cyl == 8" | \
   ./dplyr kable
   
###输出

|  mpg| cyl|  disp|  hp| drat|    wt|  qsec| vs| am| gear| carb| cyl2|
|----:|---:|-----:|---:|----:|-----:|-----:|--:|--:|----:|----:|----:|
| 18.7|   8| 360.0| 175| 3.15| 3.440| 17.02|  0|  0|    3|    2|   16|
| 14.3|   8| 360.0| 245| 3.21| 3.570| 15.84|  0|  0|    3|    4|   16|
| 16.4|   8| 275.8| 180| 3.07| 4.070| 17.40|  0|  0|    3|    3|   16|
| 17.3|   8| 275.8| 180| 3.07| 3.730| 17.60|  0|  0|    3|    3|   16|
| 15.2|   8| 275.8| 180| 3.07| 3.780| 18.00|  0|  0|    3|    3|   16|
| 10.4|   8| 472.0| 205| 2.93| 5.250| 17.98|  0|  0|    3|    4|   16|
| 10.4|   8| 460.0| 215| 3.00| 5.424| 17.82|  0|  0|    3|    4|   16|
| 14.7|   8| 440.0| 230| 3.23| 5.345| 17.42|  0|  0|    3|    4|   16|
| 15.5|   8| 318.0| 150| 2.76| 3.520| 16.87|  0|  0|    3|    2|   16|
| 15.2|   8| 304.0| 150| 3.15| 3.435| 17.30|  0|  0|    3|    2|   16|
| 13.3|   8| 350.0| 245| 3.73| 3.840| 15.41|  0|  0|    3|    4|   16|
| 19.2|   8| 400.0| 175| 3.08| 3.845| 17.05|  0|  0|    3|    2|   16|
| 15.8|   8| 351.0| 264| 4.22| 3.170| 14.50|  0|  1|    5|    4|   16|
| 15.0|   8| 301.0| 335| 3.54| 3.570| 14.60|  0|  1|    5|    8|   16|

实例三:设置aliases

通过设置aliases可以进一步方便我们调用这个工具,加快文件处理的速度。将下面的alias放到你.bashrc中:

alias mutate="dplyr mutate"
alias filter="dplyr filter"
alias select="dplyr select"
alias summarise="dplyr summarise"
alias group_by="dplyr group_by"
alias ungroup="dplyr ungroup"
alias count="dplyr count"
alias arrange="dplyr arrange"
alias kable="dplyr kable"

下面就来体验一下起飞的感觉:

cat mtcars.csv | group_by cyl | summarise "mpg = mean(mpg)" | kable

###结果
| cyl|      mpg|
|---:|--------:|
|   4| 26.66364|
|   6| 19.74286|
|   8| 15.10000|

简单的几个命令就将,根据cyl列的值来计算mpg平均值的任务执行好,并且输出到屏幕中。

实例四:连接两个文件

作者提到该功能还不是很完善,主要的缺陷有:

  • 用于连接命令后的第一个参数必须是现有文件,并且格式为(CSV或RDS)
  • 不能通过by连接指定参数,因此两个文件必须只有一个共同的列才能链接

这里我们会链接cyl.csv文件:

cat cyl.csv

####

#  cyl,description
#  4,four
#  6,six

通过inner_join命令来链接:

cat mtcars.csv | dplyr inner_join cyl.csv | dplyr kable

###结果
#  |  mpg| cyl|  disp|  hp| drat|    wt|  qsec| vs| am| gear| carb|description |
#  |----:|---:|-----:|---:|----:|-----:|-----:|--:|--:|----:|----:|:-----------|
#  | 21.0|   6| 160.0| 110| 3.90| 2.620| 16.46|  0|  1|    4|    4|six         |
#  | 21.0|   6| 160.0| 110| 3.90| 2.875| 17.02|  0|  1|    4|    4|six         |
#  | 22.8|   4| 108.0|  93| 3.85| 2.320| 18.61|  1|  1|    4|    1|four        |
#  | 21.4|   6| 258.0| 110| 3.08| 3.215| 19.44|  1|  0|    3|    1|six         |
#  | 18.1|   6| 225.0| 105| 2.76| 3.460| 20.22|  1|  0|    3|    1|six         |
#  | 24.4|   4| 146.7|  62| 3.69| 3.190| 20.00|  1|  0|    4|    2|four        |
#  | 22.8|   4| 140.8|  95| 3.92| 3.150| 22.90|  1|  0|    4|    2|four        |
#  | 19.2|   6| 167.6| 123| 3.92| 3.440| 18.30|  1|  0|    4|    4|six         |
#  | 17.8|   6| 167.6| 123| 3.92| 3.440| 18.90|  1|  0|    4|    4|six         |
#  | 32.4|   4|  78.7|  66| 4.08| 2.200| 19.47|  1|  1|    4|    1|four        |
#  | 30.4|   4|  75.7|  52| 4.93| 1.615| 18.52|  1|  1|    4|    2|four        |
#  | 33.9|   4|  71.1|  65| 4.22| 1.835| 19.90|  1|  1|    4|    1|four        |
#  | 21.5|   4| 120.1|  97| 3.70| 2.465| 20.01|  1|  0|    3|    1|four        |
#  | 27.3|   4|  79.0|  66| 4.08| 1.935| 18.90|  1|  1|    4|    1|four        |
#  | 26.0|   4| 120.3|  91| 4.43| 2.140| 16.70|  0|  1|    5|    2|four        |
#  | 30.4|   4|  95.1| 113| 3.77| 1.513| 16.90|  1|  1|    5|    2|four        |
#  | 19.7|   6| 145.0| 175| 3.62| 2.770| 15.50|  0|  1|    5|    6|six         |
#  | 21.4|   4| 121.0| 109| 4.11| 2.780| 18.60|  1|  1|    4|    2|four        |

介绍到这里就结束了,如果大家也喜欢这个实用的小工具,欢迎点击好看,转发该推文,支持我一波。

参考资料
https://github.com/coolbutuseless/dplyr-cli

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342