『R脚本练习』dplyr各种join

在刚接触用代码行处理数据的时候,受到课题组的影响,是从shell入门的,具体说逃不过sed grep awk,在这之前我只会用excel下的函数,excel下有个很好的垂直查找vertical lookup,也就是vlookup,用来快速匹配数据,硕士的时候也就是凭借这一个函数解决了2DGel上蛋白质点编号的统一。所以对vlookup有着比较深的感情,可以说这一个函数是我数据分析工作的敲门砖。
回到shell,我当时发现shell命令的强大之后(用awk写了第一个条件筛选的命令)想怎么可以用shell命令实现vlookup, 最终有了这篇awk实现excel vlookup,但是随着时间的推移,敲了越来越多的R和python代码,发现vlookup确实有一定的局限,而且当时写的shell脚本也存在一定的问题,操作也比较麻烦,数据处理,还是dplyrpandas比较强大,这里放一个新鲜的dplyr脚本,当然不只有类似vlookupleft_join,还有right_join, inner_join, full_join, 这次没有偷懒,打了getopt,到时候直接Rscript Rjoin -...

dplyr 各种join

  • vlookup 其实就是给定一个index,或者说key,然后把另一个表里关于这个key的内容找到具体操作:EXCEL入门必学的VLOOKUP函数相信我你终于可以学会了
  • dplyr的各种join可以这么理解(下表): emmmm,刚发现刘博之前发过一个帖子,这个更形象:R语言中dplyr包join函数之目前我看到过的最形象的教程
    1. 如果把表1看成left表2看成right, 那么所谓left_join就是保证表1key的顺序和数量不变,把表2中和表1-key对应的value3, value4给合并过来,如果表2中没有key中某一个值,这个值对应的表2中的value会写NA
    2. right_join参考left_join就对了,就是按照表2key顺序和数量合并表1
    3. inner_join 就比较神奇了,和你想的差不多,inner_join会取表1表2key值的交集,然后在按顺序把表1表2与这个key交集对应的value值贴过来。
    4. full_join 顾名思义,就是求并集,然后把两个表对应的value值合并过来。

表1

key value1 value2
k1 v1-1 v2-1
k2 v1-2 v2-2
k3 v1-3 v2-3
.. .. ..
kn v1-n v2-n

表2

key value3 value4
k1 v3-1 v4-1
k2 v3-2 v4-2
k3 v3-3 v4-3
.. .. ..
kn v3-n v4-n

脚本代码

首先确保你的R装了dplyr,如果没有,打开R或者Rstudio install.packages('dplyr')

########################################
#       Prj: MyScript
#       Assignment: dplyr-join
#       Author: Shawn
#######################################
##=======step1 import library==========
suppressMessages(library(getopt))
##=======step2 args setting============
command=matrix(c(
  'help', 'h', 0, 'logic', 'help information',
  'method', 'm', 1, 'character', 'JoinMethod: left, right, inner, full; default: left(equals excel vlookup)',
  'left', 'x', 1, 'character', 'left_file: the 1st file',
  'right', 'y', 1, 'character', 'right_file: the 2nd file',
  'key', 'k', 1, 'character', 'key(by): the colnames of key columns, makesure leftfile and rightfile have the same colnames of key column'
),byrow = T, ncol = 5)
args = getopt(command)

## help information
if (!is.null(args$help)) {
  cat(paste(getopt(command, usage = T), "\n"))
  q(status=1)
}

## default value
if (is.null(args$method)){
  args$method = "left"
}

## functions
suppressMessages(library(dplyr))
options(stringsAsFactors = F)
method <- args$method
left <- args$left
right <- args$right
key <- args$key

Rjoin = function(method,left,right,key){
  ## input data
  x = read.delim(file = left, header = T,
                 sep = "\t", quote = NULL)
  y = read.delim(file = right, header = T,
                 sep = "\t", quote = NULL)
  ## join
  if (method == "left") {
    z = left_join(x,y, by = key)
  } else if (method == "right") {
    z = right_join(x,y, by = key)
  } else if (method == "inner") {
    z = inner_join(x,y, by = key)
  } else if (method == "full") {
    z = full_join(x,y, by = key)
  } 
  ## output
  write.table(z,file = paste(left,right,method,key,".xls",sep = "_"),
              sep = "\t",
              quote = F,
              row.names = F)
}

Rjoin(method = method,
      left = left,
      right = right,
      key = key)

用法

windows:
复制上面的代码到代码编辑器或者Rstudio,或者记事本里保存成Rjoin.R,怎么运行脚本参考:

linux or macos:
复制上面的代码到代码编辑器或者Rstudio,或者记事本里保存成Rjoin.R, 打开终端chmod +x Rjoin.R给脚本添加可执行权限。

注意事项:

  • 两个要进行join的文件必须制表符分隔符分隔的文件,由于总有你意想不到的奇葩文件出现,本来做了sep这个可选参数,但是read.table只认识逗号,制表符,空格等常规的,为了避免麻烦,不如统一了输入文件的格式,最简单的办法就是exce -> 另存为 -> 类型选择制表符分隔符的txt.
  • 你要合并的关键列(key)必须有相同的列名!这个没办法,join函数自带的by就是通过相同列名的column来合并的
  • 如果自己在Rstudio中跑function的话,要求你要合并的两个数据表数据类型必须是 dataframe

脚本执行

一共设置了4个参数(除了帮助外),

  • -m/--method: 你想怎么合并,后面跟"left", "right", "inner" "full"。
  • -l/--left: 左边的文件(第一个文件)。
  • -r/--right: 右边的文件 (第二个文件)。
  • -k/--key: 两个文件key那一列的列名。
## 看下帮助:
~ »Rscript /Users/shawnwang/02.MyScript/BioScript/01.R/Rjoin.R -h
Usage: /Users/shawnwang/02.MyScript/BioScript/01.R/Rjoin.R [-[-help|h]] [-[-method|m] <character>] [-[-left|x] <character>] [-[-right|y] <character>] [-[-key|k] <character>]
    -h|--help      help information ## 帮助
    -m|--method    JoinMethod: left, right, inner, full; default: left(equals excel vlookup) ## 选择方法
    -x|--left      left_file: the 1st file ## 左边的文件
    -y|--right     right_file: the 2nd file ## 右边的文件
    -k|--key       key(by): the colnames of key columns, makesure leftfile and rightfile have the same colnames of key column ## 查找关键列的列名
## 下面这段代码是a.txt 和 b.txt 的node1这一列的并集相关信息合并。
Rscript /Users/shawnwang/02.MyScript/BioScript/01.R/Rjoin.R -m "full" -x a.txt -y b.txt -k "node1"

done...继续搬砖去

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

推荐阅读更多精彩内容