我有大量的基因组数据如下:
chr leftPos Def
1 23444 1
1 63226 -1
1 125325 -1
2 12 -1
3 5435 -1
3 5675 0
3 67868 0
3 78999 0
4 3465 1
5 67868 1
5 78979 1
5 80988 -1
对于每个$ chr,我想得到所有行,其中上面的行在$ Def中与下面的行在一个单独的数据帧中具有相同的条目,保留匹配的两行。 $ Def中的条目可以是-1,0或1,但我对0不感兴趣。
我对于在$ chr的最后和开头发生的事情并不感到困扰,因此可以忽略。
我想这将在某种情况下完成,但我不知道如何。
输出应该类似于:
chr leftPos Def
1 63226 -1
1 125325 -1
5 67868 1
5 78979 1
感谢。我不知道如何处理这个问题。
答案 0 :(得分:2)
我们可以使用rleid
中的data.table
。转换' data.frame'到' data.table' (setDT(df2)
),创建一个' ind'基于游程长度类型id的列。由' chr'分组和' ind'为'创建一个逻辑条件,if
nrow大于1,我们Subset the Data.table(.SD
),并分配' ind'到' NULL'。
library(data.table)#v1.9.6+
setDT(df1)[, ind:= rleid(Def)][!is.na(Def)&Def!=0, if(.N>1) .SD, .(chr, ind)]
# chr leftPos Def
#1: 1 63226 -1
#2: 1 125325 -1
#3: 5 67868 1
#4: 5 78979 1