【问题标题】:How to add unique IDs for aligned sequences of sequential numbers?如何为对齐的序号序列添加唯一 ID?
【发布时间】:2019-07-30 20:27:13
【问题描述】:

我有一个整数坐标数据表,在标记为 A 和 B 的两个组之间对齐。例如:

dt_long <- data.table(LABEL_A = c(rep("A", 20), rep("A", 15), rep ("A", 10), rep ("A", 15), rep ("A", 10)),
             SEQ_A = c(11:30, 61:75, 76:85, 86:100, 110:119),
             LABEL_B= c(rep("C", 20), rep("D", 15), rep("F", 10), rep("G",15), rep("D", 10)),
             SEQ_B = c(1:20, 25:11, 16:25, 15:1, 1:5, 8:12))

如何向这个 data.table 添加一个 ID 列,并为每个连续对齐的序列提供一个唯一的 ID?如果 SEQ_A 或 SEQ_B 不是连续连续的,或者它们属于不同的组(即 LABEL),则每个比对序列都需要一个单独的 ID。例如:

    dt_long_ID <- data.table(LABEL_A = c(rep("A", 20), rep("A", 15), rep ("A", 10), rep ("A", 15), rep ("A", 10)),
             SEQ_A = c(11:30, 61:75, 76:85, 86:100, 110:119),
             LABEL_B= c(rep("C", 20), rep("D", 15), rep("F", 10), rep("G",15), rep("D", 10)),
             SEQ_B = c(1:20, 25:11, 16:25, 15:1, 1:5, 8:12),
                  ID = c(rep(1, 20), rep(2, 15), rep(3, 10), rep(4, 15), rep(5, 5), rep(6, 5) ))

【问题讨论】:

  • @Gregor 我认为 OP 对“SEQ_A”或“SEQ_B”的绝对值变化是否超过 1 感兴趣。如果是这样,则会创建一个新 ID。
  • @tmfmnk 似乎LABEL_ALABEL_B 已经在记录了——尽管不完全是。第 20 行和第 21 行在 SEQ_A 中有一个跳跃,LABEL_A 没有变化……但SEQ_B 也有一个跳跃,LABEL_B 有变化。
  • @Gregor 这是真的。没有澄清,很难确定到底是什么问题。
  • 是的,如果 OP 能澄清一下就好了。如果LABEL_ALABEL_B 不相关,则不应将它们包含在问题中。
  • LABEL_A 和 LABEL_B 并非无关紧要,因为即使 SEQ_A 和 SEQ_B 连续连续发生任何变化,也表明需要新的唯一 ID。我已经更新了虚拟数据集。

标签: r data.table uniqueidentifier


【解决方案1】:

根据澄清的问题和更新的数据更新答案。无论LABEL 列是否为数字,这都会起作用。

# helper function for the sequential check
# the & !is.na() just corrects for the first NA value introduced by shift()
foo = function(x) cumsum(abs(x - shift(x)) > 1 & !is.na(shift(x)))

dt_long_ID[, ID2 := .GRP, by = .(rleid(LABEL_A), rleid(LABEL_B), foo(SEQ_A), foo(SEQ_B))]
all(dt_long_ID$ID == dt_long_ID$ID2)
# [1] TRUE

【讨论】:

  • rleid 本身会像 GRP 一样从 1 开始计数。此外,它可以包含多个列:dt_long_ID[, all.equal(ID, rleid(LABEL_A, LABEL_B))]
  • 哦,不知道rleid 接受多个参数。非常好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2013-04-11
  • 2012-04-27
相关资源
最近更新 更多