我有一個看起來像這樣兩個數據幀:如何比較數據幀1的每一行與數據幀2的每一行?
x=data.frame(Name=c("200003","200260","400826","400863","500710"),Chr=c("chr1","chr1","chr2","chr3","chr3"),Position=c(11880,14415,13000,15000,18000))
y=data.frame(name=c("geneA","geneB","geneC","geneD","geneE"),chrom=c("chr1","chr1","chr2","chr2","chr3"),Start=c(11873,11878,12000,14361,14361),End=c(14409,14419,14409,16765,19759))
> x
Name Chr Position
1 200003 chr1 11880
2 200260 chr1 14415
3 400826 chr2 13000
4 400863 chr3 15000
5 500710 chr3 18000
> y
name chrom Start End
1 geneA chr1 11873 14409
2 geneB chr1 11878 14419
3 geneC chr2 12000 14409
4 geneD chr2 14361 16765
5 geneE chr3 14361 19759
我想比較x和y,並返回一個數據幀或由x中每個名稱的列表和y的名字具有相同CHROM作爲Chr和(開始,結束)間隔包括位置。例如,
200003 geneA
200003 geneB
200260 geneB
400826 geneC
400863 geneE
500710 geneE
編輯:我用下面的代碼
z=merge(x,y,by.x='Chr',by.y='chrom')
z=cbind(z,with(z, Position>=Start & Position<=End))
z=z[-which(z[,7]=="FALSE"),]
output=cbind(as.character(z$Name),as.character(z$name))
在現實中,X和Y和大型數據集能得到的結果,它需要一段時間merge
運行。有一個更好的方法嗎?
這不是一個「應用」問題。你可以創建一個有用的,如果重要的中間與'merge'。 – 2014-11-20 19:41:23
也許用'split'或'data.table'?我會看看我是否可以拼湊一個data.table方法。我不是最熟悉DT的人。新版本具有範圍功能。我已經添加了一個標籤,以查看這個珊瑚礁中是否有任何data.table-barracudas。 – 2014-11-21 02:48:38
https://github.com/Rdatatable/data.table/wiki/Installation – 2014-11-21 02:53:50