Повторяющееся извлечение последовательности из списка R / столбца данных
У меня есть последовательность меток времени события, на основе которых я создал строки потока процесса события в R, как показано ниже:
- A-> B-> C->D-> Е
- А-> С->D-> Е
- B-> C-> D
- A-> E
так далее...
У меня есть 50 таких комбинаций процессов. Я хочу перечислить каждый уникальный переход, доступный в потоке процесса, как показано ниже:
- А-> Б
- А-> С
- A-> E
- B-> C
- 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()
будет намного быстрее