2016-02-12 41 views
0

我想根據一列中的信息合併兩個不同長度的數據幀。第3欄和第4欄(FROMTO)中的數據描述了數據框Lithy中給定巖性的岩心長度。根據重疊範圍合併兩個數據幀

在數據幀chemy中關於S以較小尺寸片段分析核心。 FROMTOchemy位於Lithy所述的範圍內。

chemy

coreID location FROM TO S 
1 12SW  1 52.5 56.5 0.50 
2 12SW  1 56.7 65.0 0.30 
3 12SW  1 66.0 402.0 0.20 
4 13NW  1 10.0 30.0 0.60 
5 13NW  1 32.0 35.0 0.40 
6 13NW  1 36.0 43.0 0.20 
7  13S  4 1.0 2.0 0.60 
8  13S  4 5.0 25.0 0.50 
9  13S  4 26.0 150.0 0.10 
10 13S  4 151.0 155.0 0.05 

Lithy

coreID location FROM TO  Lith1 Lith2 Lith3 
1 12SW  1 52.5 350 peridotite fine black 
2 12SW  1 350.0 420 peridotite coarse green 
3 13NW  1 3.0 50 saprolite    
4 13NW  1 51.0 400 granite    
5 13S  4 1.0 150 diorite    
6 13S  4 151.0 300 peridotite fine black 

當我試圖合併,結果表中缺少數據行–看起來只有coreIDlocation之間合併的比賽,而不是根據FROMTO的範圍合併。

我用於合併的代碼是: 一起=合併(chemy,lithy) 結果我想有巖性列添加到chemy數據幀,從而使巖性在合適的行識別(應用在FROM和TO描述的範圍內)。

+0

嘗試這種使用foverlaps請出示您用於合併的代碼。 – Stibu

+0

參見:http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right – h3rm4n

+0

FROM-TO在lithy中描述了給定的lith存在的範圍。 「chemy」中的幾行數據落在FROM TO中「lithy」所描述的範圍內。我想合併它們,但是跨越範圍 - 不僅僅是它們匹配的實例(這很少見)。 – user3196261

回答

1

你可以從data.table

library(data.table) 
setDT(chemy) 
setDT(lithy) 
setkey(lithy, coreID, location, FROM, TO) 

out = foverlaps(chemy, lithy, type="within",nomatch=0L) 
req = setnames(out, gsub('\\<i.', 'chemy.', colnames(out))) 

#>req 
# coreID location FROM TO  Lith1 Lith2 Lith3 chemy.FROM chemy.TO S 
#1: 12SW  1 52.5 350 peridotite fine black  52.5  56.5 0.50 
#2: 12SW  1 52.5 350 peridotite fine black  56.7  65.0 0.30 
#3: 13NW  1 3.0 50 saprolite     10.0  30.0 0.60 
#4: 13NW  1 3.0 50 saprolite     32.0  35.0 0.40 
#5: 13NW  1 3.0 50 saprolite     36.0  43.0 0.20 
#6: 13S  4 1.0 150 diorite     1.0  2.0 0.60 
#7: 13S  4 1.0 150 diorite     5.0  25.0 0.50 
#8: 13S  4 1.0 150 diorite     26.0 150.0 0.10 
#9: 13S  4 151.0 300 peridotite fine black  151.0 155.0 0.05