Я не создал график для вас, но я могу создать данные, которые вам понадобятся для графика. Мой подход итеративный, и чтобы избежать написания циклов for, я использую функцию map
из пакета purrr
.
Во-первых, я позволил себе немного расширить ваши данные:
transition_list <- list(c('A', 'B', 'D', 'X'), c('A', 'C', 'D', 'X'), c('A', 'B', 'E', 'X'))
Далее нам понадобятся следующие пакеты:
library(purrr)
library(dplyr)
Во-первых, я пишу пользовательскую функцию, которая преобразует один вектор во фрейм данных. Каждый «шаг» приводит к двум значениям: from
и to
. Поэтому длина моего цикла равна длине вектора минус один.
browse_individual <- function(states) {
map_df(
1:(length(states)-1),
~list(from = states[.x], to = states[.x+1])
)
}
Этот код очень лаконичен, но вот что он делает: первый аргумент map_df
- это то, что мы собираемся зациклить. Это длина вектора минус один. Второй аргумент - это то, что мы хотим вернуть для каждого шага, который представляет собой список из двух элементов, содержащий текущий элемент как from
и следующий элемент как to
. Специальная функция map_df
преобразует выходные данные (список списков) во фрейм данных.
Далее нам нужно применить эту функцию к каждому вектору в вашем списке.
state_changes <- map_df(transition_list, browse_individual)
Здесь я снова использую map_df
. Результатом каждого шага цикла является фрейм данных (а именно тот, который возвращает browse_individual
). Все эти кадры данных объединяются в один кадр данных, который называется state_changes
.
Следующая часть представляет собой некоторый код dplyr
, который подсчитывает, как часто происходит изменение, и вычисляет, насколько он вероятен с учетом позиции from
.
state_change_prob <- state_changes %>%
count(from, to) %>%
group_by(from) %>%
mutate(prob = n / sum(n)) %>%
select(from, to, prob) %>%
ungroup()
В итоге мы получаем такой результат:
> state_change_prob
#> # A tibble: 7 x 3
#> from to prob
#> <chr> <chr> <dbl>
#> 1 A B 0.667
#> 2 A C 0.333
#> 3 B D 0.5
#> 4 B E 0.5
#> 5 C D 1
#> 6 D X 1
#> 7 E X 1
Я надеюсь, что это ответ на ваш вопрос, и вы можете построить сюжет на основе этого формата данных.