Подтвердить что ты не робот

Подсчет последовательностей в строках с использованием R

Я пытаюсь написать функцию для подсчета количества последовательных экземпляров шаблона. Например, мне нужна строка

string<-"A>A>A>B>C>C>C>A>A"

преобразуется в

"3 A > 1 B > 3 C > 2 A"

У меня есть функция, которая учитывает экземпляры каждой строки, см. ниже. Но он не достигает упорядочивающего эффекта, который мне бы хотелось. Любые идеи или указатели?

Спасибо,

R

Существующая функция:

fnc_gen_PathName <- function(string) {
p <- strsplit(as.character(string), ";")
p1 <- lapply(p, table)
p2 <- lapply(p1, function(x) {
sapply(1:length(x), function(i) {
  if(x[i] == 25){
    paste0(x[i], "+ ", names(x)[i])
  } else{
    paste0(x[i], "x ", names(x)[i])
  }
})
})
p3 <- lapply(p2, function(x) paste(x, collapse = "; "))
p3 <- do.call(rbind, p3)
return(p3)
}
4b9b3361

Ответ 1

Как прокомментировал @MrFlick, вы можете попробовать следующее: rle и strsplit

with(rle(strsplit(string, ">")[[1]]), paste(lengths, values, collapse = " > "))
## [1] "3 A > 1 B > 3 C > 2 A"

Ответ 2

Вот два решения dplyr: один регулярный и один с rle. Преимущества заключаются в следующем: может вводить несколько строк в виде вектора, формирует аккуратный промежуточный набор данных до (ugh).

library(dplyr)
library(tidyr)
library(stringi)

strings = "A>A>A>B>C>C>C>A>A"


data_frame(string = strings) %>%
  mutate(string_split =
           string %>%
           stri_split_fixed(">")) %>%
  unnest(string_split) %>%
  mutate(ID = 
           string_split %>%
           lag %>%
           `!=`(string_split) %>%
           plyr::mapvalues(NA, TRUE) %>%
           cumsum) %>%
  count(string, ID, string_split) %>%
  group_by(string) %>%
  summarize(new_string =
              paste(n, 
                    string_split, 
                    collapse = " > ") )

data_frame(string = strings) %>%
  group_by(string) %>%
  do(.$string %>%
       first %>%
       stri_split_fixed(">") %>%
       first %>%
       rle %>%
       unclass %>%
       as.data.frame) %>%
  summarize(new_string = 
              paste(lengths, values, collapse = " > "))