Повторяющееся извлечение последовательности из списка R / столбца данных

У меня есть последовательность меток времени события, на основе которых я создал строки потока процесса события в R, как показано ниже:

  1. A-> B-> C->D-> Е
  2. А-> С->D-> Е
  3. B-> C-> D
  4. A-> E

так далее...

У меня есть 50 таких комбинаций процессов. Я хочу перечислить каждый уникальный переход, доступный в потоке процесса, как показано ниже:

  1. А-> Б
  2. А-> С
  3. A-> E
  4. B-> C
  5. C-> D

так далее..

Я не мог понять, как сделать это в R. Любое руководство / решение будет очень полезно

Благодарю.

1 ответ

Решение

После @alistaire разделите входящую строку на ->, затем запишите количество элементов в каждой последовательности.

t <- strsplit(s, "->", fixed=TRUE)
len <- lengths(t)

Сейчас, unlist t и использовать накопленную сумму длин, чтобы отбросить последний или первый элемент, чтобы получить "от" и "до" узлов

u <- unlist(t)
clen = cumsum(len)
from <- u[-clen]
to <- u[-(1 + c(0, clen[-length(clen)]))]

вставить from а также to вместе, найти уникальные значения и отсортировать

sort(unique(paste(from, to, sep="->")))

Как единственная функция

f0 <- function(s) {
    t <- strsplit(s, "->", fixed=TRUE)
    clen <- cumsum(lengths(t))

    u <- unlist(t)
    from <- u[-clen]
    to <- u[-(1 + c(0, clen[-length(clen)]))]
    sort(unique(paste(from, to, sep="->")))
}

Для вашего образца

s <- c("A->B->C->D->E",
       "A->C->D->E",
       "B->C->D",
       "A->E")

Выход

> f0(s)
[1] "A->B" "A->C" "A->E" "B->C" "C->D" "D->E"

который перечисляет все наблюдаемые одношаговые переходы по всему набору данных. Это то, что вы хотите?

Решение @ alistaire, обобщенное для обработки нескольких строк

f1 <- function(s) {
    t <- strsplit(s, "->", fixed=TRUE)
    res <- lapply(t, function(s) {
        sapply(seq_along(s[-1]), function(x) {
            paste(s[x], s[x+1], sep = '->')
        })
    })
    sort(unique(unlist(res)))
}

Простой тест для идентификации и бенчмаркинга

> library(microbenchmark)
> identical(f0(s), f1(s))
[1] TRUE
> microbenchmark(f0(s), f1(s))
Unit: microseconds
  expr     min      lq      mean   median       uq     max neval cld
 f0(s)  45.379  47.010  48.62282  47.6240  48.4005 120.063   100  a 
 f1(s) 179.509 182.168 184.41779 182.9585 183.7985 234.607   100   b

Для больших наборов данных f0() будет намного быстрее

Другие вопросы по тегам