r - 合并具有重叠间隔的两个数据帧

标签 r dataframe

<分区>

如何合并具有重叠间隔的 data.frames 中的 data.frame?

数据框 1

read.table(textConnection(
 "   from to Lith Form 
1   0   1.2 GRN   BCM
2   1.2 5.0 GDI   BDI
"), header=TRUE)    

数据框 2

read.table(textConnection(
"   from to Weath Str
1   0  1.1  HW ES
2   1.1 2.9 SW VS
3   2.9 5.0 HW ST 
"), header=TRUE) 

结果数据框

from to Weath Str Lith Form
1 0.0 1.1 HW ES GRN  BCM
2 1.1 1.2 SW VS GRN  BCM
3 1.2 2.9 SW VS GDI  BDI
4 2.9 5.0 HW ST GDI  BDI

最佳答案

这是一种方法。它类似于 eddi ( R cutting two data.frames based on intervals and merging ) 的答案,但您可以根据需要在 data.frames 中拥有任意数量的列。

# change your data to data.table
dt1 <- data.table(df1, key='from')
dt2 <- data.table(df2, key='from')
# skeleton for joined data.table
dt <- data.table(from=sort(unique(c(dt1[,from], dt2[,from]))), 
                 to=sort(unique(c(dt1[,to], dt2[,to]))), 
                 key='from')
# function to join skeleton with data.table
j1 <- function(dt, dt1){
  dt3 <- dt1[dt, roll=TRUE]
  dt3[,':='(to=to.1, to.1=NULL)]
  setkey(dt3, from, to)
  return(dt3)
}
# merge two data.tables
j1(dt, dt2)[j1(dt, dt1)]

在 v1.9.3 中,最近实现了重叠连接(或间隔连接)。有了这个,我认为你的任务可以按如下方式完成(假设你的 data.frames 是 df1df2):

require(data.table) ## 1.9.3+
setDT(df1)  ## convert to data.table without copy
setDT(df2)

setkey(df2, from, to)
ans = foverlaps(df1, df2, type="any")
ans = ans[, `:=`(from = pmax(from, i.from), to = pmin(to, i.to))]
ans = ans[, `:=`(i.from=NULL, i.to=NULL)][from <= to]
#    from  to Weath Str Lith Form
# 1:  0.0 1.1    HW  ES  GRN  BCM
# 2:  1.1 1.2    SW  VS  GRN  BCM
# 3:  1.2 2.9    SW  VS  GDI  BDI
# 4:  2.9 5.0    HW  ST  GDI  BDI

关于r - 合并具有重叠间隔的两个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507727/

相关文章:

r - lme4::glmer.nb 函数根据我运行模型的顺序产生 "Error in family$family : $ operator not defined for this S4 class"

r - 加速 R 中大型数据集上计算 mann-kendall 测试的并行过程

r - 为什么赋值符号 “=” 和 R 中的 “<-” 有不同的行为?

R:将数据帧列表合并为单个数据帧,并添加带有列表索引的列

Python Pandas 嵌套 MongoDB

R:将记录插入矩阵时避免循环

r - R 中的非线性回归预测

r - 在大型数据框中生成指标

python - 根据另一个数据集中的元素位置过滤 pandas 数据帧的快速方法

python - 如何从 nltk 中的 freqDist 获取元组列表