gpt4 book ai didi

按组别和年份之间的范围重叠/相交

转载 作者:行者123 更新时间:2023-12-01 13:25:53 25 4
gpt4 key购买 nike

我有一个标记的个体列表(Mark 列),这些个体在河流(LocStart 和 LocEnd)范围内的不同年份(Year 列)被捕获。在河上的位置以米为单位。

我想知道一个被标记的个体是否在不同年份之间使用过重叠范围,即该个体是否每年都去过河流的同一段。

这是原始数据集的示例:

IDMark YearLocStartLocEnd
11081199221,72922,229
21081199221,20321,703
31081200521,50822,008
41126199419,22219,522
51126199418,81119,311
61283200521,75422,254
71283200722,02522,525

这是我希望最终答案的样子:

MarkYear1Year2IDs
1081199220051, 3
1081199220052, 3
1283200520076, 7

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

我想在 R 中执行此操作并查看了 >IRanges 包,但无法考虑 group = Mark 并能够提取 Year1 和 Year2 信息。

最佳答案

使用 data.table 包中的 foverlaps() 函数:

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
  1. 我们首先使用 setDT 通过引用将 data.frame 转换为 data.table。然后,我们在 MarkLocStartLocEnd 列上键入 data.table ,这将使我们能够执行重叠范围连接。

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

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

  4. 添加所有其他列并将 xidyid 替换为相应的 ID 值,以供引用。

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

关于按组别和年份之间的范围重叠/相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28019283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com