【问题标题】:Find indices of sequential duplicates in string in R [duplicate]在R中查找字符串中顺序重复的索引[重复]
【发布时间】:2019-05-07 20:15:30
【问题描述】:

我有一个已转换为字符向量的字符串:

string <- c("A","A","A","C","G","G","C","C","T","T","T","T")

我希望能够输出一个表格,按照它们出现的顺序显示连续字母的索引。例如:

letter start end
A 1 3
C 4 4
G 5 6
C 7 8
T 9 12

我尝试过查看str_locate 和其他一些 str 函数,但无法弄清楚。任何帮助表示赞赏!

【问题讨论】:

    标签: r string


    【解决方案1】:

    我将在rle 之后使用cumsum

    s=rle(string)
    v=cumsum(rle(string)$lengths)
    data.frame('var'=s$values,'start'=v+1-s$lengths,'end'=v)
      var start end
    1   A     1   3
    2   C     4   4
    3   G     5   6
    4   C     7   8
    5   T     9  12
    

    【讨论】:

      【解决方案2】:

      我们可以将split通过'string'的run-length-id转换成list,得到range的值,和rbindlist元素

      rl <- rle(string)
      lst <- lapply(split(seq_along(string), rep(seq_along(rl$values), rl$lengths)), range)
      names(lst) <- r1$values
      do.call(rbind, lst)
      #  [,1] [,2]
      #A    1    3
      #C    4    4
      #G    5    6
      #C    7    8
      #T    9   12
      

      或者以紧凑的方式

      library(data.table)
      data.table(letter = string)[, .(letter = letter[1], start = .I[1],
                     end = .I[.N]), rleid(letter)]
      

      tidyverse

      library(tidyverse)
      library(data.table)
      string %>% 
         tibble(letter = .) %>% 
         mutate(rn = row_number()) %>%
         group_by(grp = rleid(letter)) %>% 
         summarise(letter = first(letter), 
                   start = first(rn), 
                   end = last(rn)) %>%
         ungroup %>% 
         select(-grp)
      

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2013-07-15
        • 2016-06-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多