『R腳本練習』dplyr各種join

在剛接觸用代碼行處理數(shù)據(jù)的時候如输,受到課題組的影響鼓黔,是從shell入門的,具體說逃不過sed grep awk,在這之前我只會用excel下的函數(shù)不见,excel下有個很好的垂直查找vertical lookup,也就是vlookup澳化,用來快速匹配數(shù)據(jù),碩士的時候也就是憑借這一個函數(shù)解決了2DGel上蛋白質點編號的統(tǒng)一稳吮。所以對vlookup有著比較深的感情缎谷,可以說這一個函數(shù)是我數(shù)據(jù)分析工作的敲門磚。
回到shell灶似,我當時發(fā)現(xiàn)shell命令的強大之后(用awk寫了第一個條件篩選的命令)想怎么可以用shell命令實現(xiàn)vlookup列林, 最終有了這篇awk實現(xiàn)excel vlookup,但是隨著時間的推移,敲了越來越多的R和python代碼酪惭,發(fā)現(xiàn)vlookup確實有一定的局限希痴,而且當時寫的shell腳本也存在一定的問題,操作也比較麻煩春感,數(shù)據(jù)處理砌创,還是dplyrpandas比較強大,這里放一個新鮮的dplyr腳本鲫懒,當然不只有類似vlookupleft_join纺铭,還有right_join, inner_join, full_join, 這次沒有偷懶,打了getopt刀疙,到時候直接Rscript Rjoin -...

dplyr 各種join

  • vlookup 其實就是給定一個index,或者說key扫倡,然后把另一個表里關于這個key的內容找到具體操作:EXCEL入門必學的VLOOKUP函數(shù)相信我你終于可以學會了
  • dplyr的各種join可以這么理解(下表): emmmm谦秧,剛發(fā)現(xiàn)劉博之前發(fā)過一個帖子竟纳,這個更形象:R語言中dplyr包join函數(shù)之目前我看到過的最形象的教程
    1. 如果把表1看成left表2看成right, 那么所謂left_join就是保證表1key的順序和數(shù)量不變,把表2中和表1-key對應的value3, value4給合并過來疚鲤,如果表2中沒有key中某一個值锥累,這個值對應的表2中的value會寫NA
    2. right_join參考left_join就對了,就是按照表2key順序和數(shù)量合并表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給腳本添加可執(zhí)行權限。

注意事項:

  • 兩個要進行join的文件必須制表符分隔符分隔的文件靶剑,由于總有你意想不到的奇葩文件出現(xiàn)蜻拨,本來做了sep這個可選參數(shù),但是read.table只認識逗號桩引,制表符缎讼,空格等常規(guī)的,為了避免麻煩坑匠,不如統(tǒng)一了輸入文件的格式血崭,最簡單的辦法就是exce -> 另存為 -> 類型選擇制表符分隔符的txt.
  • 你要合并的關鍵列(key)必須有相同的列名!這個沒辦法厘灼,join函數(shù)自帶的by就是通過相同列名的column來合并的
  • 如果自己在Rstudio中跑function的話夹纫,要求你要合并的兩個數(shù)據(jù)表數(shù)據(jù)類型必須是 dataframe

腳本執(zhí)行

一共設置了4個參數(shù)(除了幫助外),

  • -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...繼續(xù)搬磚去

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锄开,隨后出現(xiàn)的幾起案子素标,更是在濱河造成了極大的恐慌,老刑警劉巖萍悴,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件头遭,死亡現(xiàn)場離奇詭異,居然都是意外死亡癣诱,警方通過查閱死者的電腦和手機计维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡刘,“玉大人享潜,你說我怎么就攤上這事⌒崾撸” “怎么了剑按?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澜术。 經(jīng)常有香客問我艺蝴,道長,這世上最難降的妖魔是什么鸟废? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任猜敢,我火速辦了婚禮,結果婚禮上盒延,老公的妹妹穿的比我還像新娘缩擂。我一直安慰自己,他們只是感情好添寺,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布胯盯。 她就那樣靜靜地躺著,像睡著了一般计露。 火紅的嫁衣襯著肌膚如雪博脑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天票罐,我揣著相機與錄音叉趣,去河邊找鬼。 笑死该押,一個胖子當著我的面吹牛疗杉,可吹牛的內容都是我干的。 我是一名探鬼主播蚕礼,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乡数,長吁一口氣:“原來是場噩夢啊……” “哼椭蹄!你這毒婦竟也來了?” 一聲冷哼從身側響起净赴,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罩润,沒想到半個月后玖翅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡割以,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年金度,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严沥。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡猜极,死狀恐怖,靈堂內的尸體忽然破棺而出消玄,到底是詐尸還是另有隱情跟伏,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布翩瓜,位于F島的核電站受扳,受9級特大地震影響,放射性物質發(fā)生泄漏兔跌。R本人自食惡果不足惜勘高,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坟桅。 院中可真熱鬧华望,春花似錦、人聲如沸仅乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽方灾。三九已至建蹄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裕偿,已是汗流浹背洞慎。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘿棘,地道東北人劲腿。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像鸟妙,于是被迫代替她去往敵國和親焦人。 傳聞我的和親對象是個殘疾皇子挥吵,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容