在剛接觸用代碼行處理數(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ù)處理砌创,還是dplyr
和pandas
比較強大,這里放一個新鮮的dplyr
腳本鲫懒,當然不只有類似vlookup
的left_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
看成left
,表2
看成right
, 那么所謂left_join
就是保證表1
的key
的順序和數(shù)量不變,把表2
中和表1-key
對應的value3, value4
給合并過來疚鲤,如果表2
中沒有key
中某一個值锥累,這個值對應的表2
中的value
會寫NA
-
right_join
參考left_join
就對了,就是按照表2
的key
順序和數(shù)量合并表1
的 -
inner_join
就比較神奇了集歇,和你想的差不多桶略,inner_join會取表1
和表2
的key
值的交集,然后在按順序把表1
诲宇,表2
與這個key
交集對應的value
值貼過來际歼。 -
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,怎么運行腳本參考:
- 將R加入環(huán)境變量宙暇,并啟動R腳本
- windows10建議開啟內建的bash教程 然后裝
miniconda
输枯, 然后在conda下裝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ù)搬磚去