r - 如何减少对齐的序列以开始和结束坐标?
问题描述
我有一个标记坐标的数据表,在两组(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))
如何将此信息简化为简短格式,其中给出了每个对齐序列的开始和结束坐标。例如:
dt_short <- data.table(LABEL_A = c("A", "A", "A", "A", "A", "A"),
Start_A = c(11, 61, 76, 86, 110, 115),
End_A = c(30, 75, 85, 100, 114, 119),
LABEL_B= c("C", "D", "F", "G", "D", "D"),
Start_B = c(1, 25, 16, 15, 1, 8),
End_B = c(20, 11, 25, 1, 5, 12))
每个对齐序列的长度应该相同。例如:
identical(abs(dt_short$End_A - dt_short$Start_A), abs(dt_short$End_B - dt_short$Start_B))
解决方案
您可以使用rleid
并合并 Frank 的评论来删除分组列
dt_long[, .(
LABEL_A=LABEL_A[1L], Start_A=SEQ_A[1L], End_A=SEQ_A[.N],
LABEL_B=LABEL_B[1L], Start_B=SEQ_B[1L], End_B=SEQ_B[.N]),
by=rleid(LABEL_A, LABEL_B,
c(0L, cumsum(diff(SEQ_A) > 1L)),
c(0L, cumsum(diff(SEQ_B) > 1L)))][, (1) := NULL]
输出:
LABEL_A Start_A End_A LABEL_B Start_B End_B
1: A 11 30 C 1 20
2: A 61 75 D 25 11
3: A 76 85 F 16 25
4: A 86 100 G 15 1
5: A 110 114 D 1 5
6: A 115 119 D 8 12
推荐阅读
- jquery - 在加载而不是单击时运行 MultiSelect
- angular - 使用TestCafe登录后如何捕获角度页面?
- regex - 具有多个目录的 Url 的正则表达式
- java - 如何根据原始数字增加总数
- c++ - C++ 为什么原始双精度数组中的赋值似乎比双变量赋值要快得多?
- java - 具有缓存功能的 Http Proxy servlet
- python - 如何在 tkinter 组合框的下拉列表中添加值?
- c - 是否可以使用格式说明符作为函数的参数
- amp-html - AMP-IFRAME 与 iframe 的来源相同
- html - 从 CLOB ListAgg 值中删除 Oracle SQL 中的 HTML 代码