[英]Merging two dataframes based on overlapping ranges
我想基于一列中的信息合并两个不同长度的数据帧。 第3列和第4列中的数据( FROM
和TO
)描述了数据框架Lithy
给定岩性的岩心长度。
分析了数据帧chemy
中较小片段的S
的核心。 在FROM
和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
和TO
范围合并。
我用来合并的代码是:Together = merge(chemy,lithy)我想要将结果的石版栏添加到chemy数据框中,以便在适当的行中标识石版(应用于FROM和描述的范围)至)。
您可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.