R语言 如何移除数据框中包含已包含在另一字符串中的子字符串的行?

7bsow1i6  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(201)

所以我有一个数据框,里面包含了物种的名字和每个物种不同的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
m0rkklqb

m0rkklqb1#

df %>%
  group_by(Species) %>%
  mutate(inother = mapply(function(ptn, rownum) any(grepl(ptn, sequence[-rownum])),
                          sequence, row_number())) %>%
  filter(size >= 5 & !inother) %>%
  ungroup() %>%
  select(-inother)
# # A tibble: 5 × 3
#   Species            sequence       size
#   <chr>              <chr>         <int>
# 1 Tilapia guineensis AAATGGAATAGAT    13
# 2 Tilapia guineensis TTATGGAGTAGA     12
# 3 Sprattus sprattus  GTGCAATGCA       10
# 4 Eutrigla gurnardus ACTGACTGATCG     12
# 5 Eutrigla gurnardus ACGAGTTTGCGAG    13

mapply代码在每个sequence上迭代(如ptn),查看它是否在另一个字符串中匹配。因为它总是匹配自己,所以我使用sequence[-rownum]从grp的RHS中排除了它自己的值。其中rownum由每个组中的row_number()提供。可以使用更高级的模式对此进行扩展,以确保它不匹配equal(但不同行)sequence值,如果需要,通过将模式更新为类似sprintf("(.%s|%s.)", ptn, ptn)的形式以查找至少一个前导或尾随额外字符。

ovfsdjhp

ovfsdjhp2#

以R为基数:

a <- which(!adist(df$sequence, df$sequence, partial = TRUE), TRUE)
b <-igraph::clusters(igraph::graph_from_data_frame(a,FALSE))$membership
subset(df,ave(size, b, FUN = max) == size)
#>               Species      sequence size
#> 3  Tilapia guineensis AAATGGAATAGAT   13
#> 4  Tilapia guineensis  TTATGGAGTAGA   12
#> 7   Sprattus sprattus    GTGCAATGCA   10
#> 8  Eutrigla gurnardus  ACTGACTGATCG   12
#> 10 Eutrigla gurnardus ACGAGTTTGCGAG   13

相关问题