基于重叠范围合并两个数据帧

时间:2016-02-12 14:51:59

标签: r merge

我想根据一列中的信息合并两个不同长度的数据帧。第3列和第4列(FROMTO)中的数据描述了数据框Lithy中给定岩性的核心长度。

在数据框S中针对较小尺寸片段的chemy分析核心。 FROM的{​​{1}}和TO位于chemy描述的范围内。

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 coreID之间的匹配,而不是基于location中的范围进行合并FROM

我以前合并的代码是:     在一起=合并(chemy,lithy) 结果我想将岩性列添加到化学数据框中,以便在适当的行中识别岩性(在FROM和TO描述的范围内应用)。

1 个答案:

答案 0 :(得分:1)

您可以使用foverlaps

中的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