将R中的2个数据集以不同的范围间隔组合在一起,以创建一个新的数据集,其范围可说明原始数据集内的重叠情况

时间:2019-07-15 00:26:24

标签: r excel range

我有两个数据集。数据集1包含具有range startrange endvariable Y的列。数据集2包含具有range startrange endvariable Avariable Bvariable C的列。

我想比较两个数据集中的两组范围,并创建一个新的数据集,该数据集在两列中具有范围重叠(即开始范围重叠,结束范围重叠)以及该重叠的所有变量(即{ {1}},variable Yvariable Avariable B

我对R很陌生,所以我对如何解决这个问题或什至无法正确解释感到有些困惑,但这是我认为可以解释的示例。

variable C

enter image description here

Dataset 1:
Start range (96.98, 97.02, 97.06)
End range (97.005, 97.05, 97.095)
Variable Y (1.48, 0.42, 4.78)

enter image description here

Dataset 2:
start range(96.95, 97, 97.05)
end range(97, 97.05, 97.1)
Variable A (100, 50, 10)
Variable B (0, 30, 30)

enter image description here

*请注意,NA是没有值的-在这种情况下,我仍然希望包含不重叠的列。

1 个答案:

答案 0 :(得分:2)

如果您只想要重叠的范围,那将很容易:例如,可以使用sqldf将其编写为SQL连接。

library(sqldf)
sqldf("
  SELECT MAX(d1.start, d2.start) AS start,
         MIN(d1.end,   d2.end)   AS end,
         d1.start AS start1,
         d1.end   AS end1,
         d2.start AS start2,
         d2.end   AS end2,
         d1.Y, d2.A, d2.B, d2.C
  FROM d1, d2
  WHERE d1.start <= d2.end AND d2.start <= d1.end
")

如果您还希望没有重叠的时间间隔,则比较棘手; 特别是,给定间隔可以有几个不重叠的子间隔。 一种解决方案是首先通过收集所有端点来计算所有这些子间隔。

dates <- sort( unique( c( d1$start, d1$end, d2$start, d2$end ) ) )
d <- data.frame(
  start = dates[-length(dates)],
  end   = dates[-1]
)
t1 <- sqldf("
    SELECT d.start, d.end, d1.Y
    FROM d LEFT JOIN d1
    ON MAX(d.start, d1.start) < MIN(d.end, d1.end)
")
t2 <- sqldf("
    SELECT d.start, d.end, d2.A, d2.B, d2.C
    FROM d LEFT JOIN d2
    ON MAX(d.start, d2.start) < MIN(d.end, d2.end)
")
sqldf( "SELECT * FROM t1 JOIN t2 USING (start, end)" )

使用的样本数据:

d1 <- data.frame(
  start = c(96.98, 97.02, 97.06),
  end   = c(97.005, 97.05, 97.095),
  Y     = c(1.48, 0.42, 4.78)
)
d2 <- data.frame(
  start = c(96.95, 97, 97.05),
  end   = c(97, 97.05, 97.1),
  A     = c(100,0,0),
  B     = c(0,0,0),
  C     = c(0,100,100)
)