所以我有一个数据框,里面包含了物种的名字和每个物种不同的DNA序列。有时候同一物种的序列是不同的,有时候它们是相似的,尽管大小不同。
我尝试做的是删除数据框中的行,这些行的序列已经包含在其他行的序列中,前提是它们具有最小大小。
例如,在下面的示例中,如果一个序列的大小至少为5,并且包含在另一个序列中,我希望删除该行,并将该行保留在最大序列中:
Species | sequence | size
-----------------------------------------
Tilapia guineensis | AAATGGA | 7
Tilapia guineensis | AAATGGAATA |10
Tilapia guineensis | AAATGGAATAGAT|13
Tilapia guineensis | TTATGGAGTAGA |12
Sprattus sprattus | GTGCA |5
Sprattus sprattus | GTGCAATGC |9
Sprattus sprattus | GTGCAATGCA |10
Eutrigla gurnardus | ACTGACTGATCG |12
Eutrigla gurnardus | ACTGACT |7
Eutrigla gurnardus | ACGAGTTTGCGAG|13
输出将是以下 Dataframe :
Species | sequence | size
--------------------------------------------
Tilapia guineensis | AAATGGAATAGAT|13
Tilapia guineensis | TTATGGAGTAGA |12
Sprattus sprattus | GTGCAATGCA |10
Eutrigla gurnardus | ACTGACTGATCG |12
Eutrigla gurnardus | ACGAGTTTGCGAG|13
我试过使用dplyr按物种对行进行分组,然后使用grep查找并删除包含在其他行序列中的序列。不幸的是,我无法对序列进行子集化:
library(dplyr)
df2<-df%>%
group_by(Species) %>%
df[-(grep(sequence[1:5],sequence)),]
我收到此错误:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'pattern' in selecting a method for function 'grep': object of type 'closure' is not subsettable
2条答案
按热度按时间m0rkklqb1#
mapply
代码在每个sequence
上迭代(如ptn
),查看它是否在另一个字符串中匹配。因为它总是匹配自己,所以我使用sequence[-rownum]
从grp的RHS中排除了它自己的值。其中rownum
由每个组中的row_number()
提供。可以使用更高级的模式对此进行扩展,以确保它不匹配equal(但不同行)sequence
值,如果需要,通过将模式更新为类似sprintf("(.%s|%s.)", ptn, ptn)
的形式以查找至少一个前导或尾随额外字符。ovfsdjhp2#
以R为基数: