R 如何将对齐序列减少到起始和结束坐标?
我有一个标记坐标的数据表,在两个组(a和B)之间对齐。例如:R 如何将对齐序列减少到起始和结束坐标?,r,data.table,melt,R,Data.table,Melt,我有一个标记坐标的数据表,在两个组(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)
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))
一种简单的方法是按两个标签分组,并获得每组的
第一个
和最后一个
,即
library(data.table)
dt_long[, .(Start_A = first(SEQ_A), End_A = last(SEQ_A), Start_B = first(SEQ_B), End_B = last(SEQ_B)), by = .(LABEL_A, LABEL_B)][]
# LABEL_A LABEL_B Start_A End_A Start_B End_B
#1: 1 3 11 30 1 20
#2: 1 4 61 75 25 11
#3: 1 6 76 85 16 25
#4: 1 7 86 100 15 1
我们只需要子集和
dcast
。当有许多不同的列组时,也可以无缝工作
dcast(dt_long[, .SD[c(1, .N)], .(LABEL_A, LABEL_B)],
LABEL_A + LABEL_B ~ c("Start", "End")[rowid(LABEL_A, LABEL_B)],
value.var = c("SEQ_A", "SEQ_B"))
# LABEL_A LABEL_B SEQ_A_End SEQ_A_Start SEQ_B_End SEQ_B_Start
#1: 1 3 30 11 20 1
#2: 1 4 75 61 11 25
#3: 1 6 85 76 25 16
#4: 1 7 100 86 1 15
您可以使用
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
LABEL
列是否与长度有关No,LABEL列可区分不同组中的序列。遗憾的是,如果有多个序列具有相同的标签,则这不起作用。我现在已经更新了示例。您认为可以添加一个ID列来对对齐的序列进行分组吗?我得到以下错误:error in.subset2(x,I,exact=exact):subscript out ofbounds@Powege. 这是你文章中ssame示例的错误,我无法重现。我使用了data.table_1.12.2
version这是我使用当前示例数据集和data.table version 1.10.4得到的错误-3@Powege. 您是否可以更新数据。tablee VersionTanks,现在运行;但是,它确实产生了与更新示例中相同的dt_short。是否可以对其进行调整,以确保每个对齐序列的长度相同?是否可以进行调整,以便在其中一个序列不连续时,它们由单独的开始和结束坐标定义?我已经更新了示例数据集来演示这一点。谢谢。也解决了这个问题。这个格式正确吗?它似乎缺少逗号和方括号,并给出了一个错误。哦,一些复制粘贴问题更有效地删除带有DT[,(1):=NULL]或我猜是什么的列。我认为,DT[,-1]创建了一个新表。
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