我想根据一列中的信息合并两个不同长度的数据帧。第3列和第4列(FROM
和TO
)中的数据描述了数据框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描述的范围内应用)。
答案 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