Joe*_*ird 3 r range overlap intersect
我有一个标记个人列表(列标记),它们在河流范围内(LocStart和LocEnd)被捕获了多年(列年份).河上的位置以米为单位.
我想知道一个有标记的人是否使用了多年间的重叠范围,即个人是否每年都去过同一段河段.
以下是原始数据集的示例:
ID
Mark年份LocStartLocEnd
11081199221,72922229
21081199221,20321703
31081200521,50822008
41126199419,22219522
51126199418,81119311
61283200521,75422254
71283200722,02522525
以下是我想要的最终答案:
马克
Year1YEAR2IDs
10811992年20051,3
108119922005年2, 3
1283200520076,7
在这种情况下,个别1126不会在最终输出中,因为可用的唯一两个范围是同一年.我意识到删除Year1 = Year2的所有记录都很容易.
我想在R中执行此操作并查看> IRanges包但未能考虑group = Mark并且能够提取Year1和Year2信息.
使用包中的foverlaps()功能data.table:
require(data.table)
setkey(setDT(dt), Mark, LocStart, LocEnd) ## (1)
olaps = foverlaps(dt, dt, type="any", which=TRUE) ## (2)
olaps = olaps[dt$Year[xid] != dt$Year[yid]] ## (3)
olaps[, `:=`(Mark = dt$Mark[xid],
Year1 = dt$Year[xid],
Year2 = dt$Year[yid],
xid = dt$ID[xid],
yid = dt$ID[yid])] ## (4)
olaps = olaps[xid < yid] ## (5)
# xid yid Mark Year1 Year2
# 1: 2 3 1081 1992 2005
# 2: 1 3 1081 1992 2005
# 3: 6 7 1283 2005 2007
Run Code Online (Sandbox Code Playgroud)
我们首先将转换data.frame到data.table使用参考setDT.然后,我们键入的data.table在列Mark,LocStart并且LocEnd,这将使我们能够进行重叠范围加入.
我们用任何类型的重叠来计算自身重叠(dt与其自身).但我们在这里使用返回匹配的索引.which = TRUE
删除Year对应xid且yid相同的所有索引.
添加所有其他列,xid并通过引用替换yid相应的ID值.
删除xid> =的所有索引yid.如果第1行与第3行重叠,则第3行也与第1行重叠.我们不需要两者.foverlaps()还没有办法在默认情况下删除它.