我有两个数据集。数据集1包含具有range start
,range end
和variable Y
的列。数据集2包含具有range start
,range end
,variable A
,variable B
和variable C
的列。
我想比较两个数据集中的两组范围,并创建一个新的数据集,该数据集在两列中具有范围重叠(即开始范围重叠,结束范围重叠)以及该重叠的所有变量(即{ {1}},variable Y
,variable A
,variable B
)
我对R很陌生,所以我对如何解决这个问题或什至无法正确解释感到有些困惑,但这是我认为可以解释的示例。
variable C
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)
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)
*请注意,NA是没有值的-在这种情况下,我仍然希望包含不重叠的列。
答案 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)
)