范围重叠/按组和年份之间交叉

Joe*_*ird 3 r range overlap intersect

我有一个标记个人列表(列标记),它们在河流范围内(LocStart和LocEnd)被捕获了多年(列年份).河上的位置以米为单位.

我想知道一个有标记的人是否使用了多年间的重叠范围,即个人是否每年都去过同一段河段.

以下是原始数据集的示例:

ID Mark 年份LocStartLocEnd
1 10811992 21,72922229
2 10811992 21,20321703
3 10812005 21,50822008
4 11261994 19,22219522
5 11261994 18,81119311
6 12832005 21,75422254
7 12832007 22,02522525

以下是我想要的最终答案:

马克Year1YEAR2 IDs
10811992年20051,3
1081 19922005年2, 3
12832005 20076,7

在这种情况下,个别1126不会在最终输出中,因为可用的唯一两个范围是同一年.我意识到删除Year1 = Year2的所有记录都很容易.

我想在R中执行此操作并查看> IRanges包但未能考虑group = Mark并且能够提取Year1和Year2信息.

Aru*_*run 6

使用包中的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)
  1. 我们首先将转换data.framedata.table使用参考setDT.然后,我们键入data.table在列Mark,LocStart并且LocEnd,这将使我们能够进行重叠范围加入.

  2. 我们用任何类型的重叠来计算自身重叠(dt与其自身).但我们在这里使用返回匹配的索引.which = TRUE

  3. 删除Year对应xidyid相同的所有索引.

  4. 添加所有其他列,xid并通过引用替换yid相应的ID值.

  5. 删除xid> =的所有索引yid.如果第1行与第3行重叠,则第3行也与第1行重叠.我们不需要两者.foverlaps()还没有办法在默认情况下删除它.