Найти индексы последовательных дубликатов в строке в R

У меня есть строка, которую я преобразовал в вектор символов:

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, но не смог в этом разобраться. Любая помощь приветствуется!


person Beeba    schedule 07.05.2019    source источник


Ответы (2)


Мы можем использовать split по идентификатору длины строки 'string' в list, получить range значений и rbind list элементов.

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)
person akrun    schedule 07.05.2019

Я буду использовать cumsum после rle

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
person BENY    schedule 07.05.2019