Матрица переходов для кластерного анализа в R

#r #dplyr

#r #dplyr

Вопрос:

У меня есть следующий набор данных, где кластер столбцов-это начальный кластер, а lt_clust-результирующий кластер через некоторое время:

 dataset lt;- data.frame(Id = c(101, 102, 103, 104, 105, 106, 107, 108,   109, 110, 111, 112, 113, 114),   clust = c("k1", "k1", "k1", "k1","k1", "k2", "k2",   "k2", "k2", "k2", "k3", "k3", "k3", "k3"),   lt_clust = c("k2", "k1", "k1", "k1", "k1", "k2", "k3",   "k1", "k2", "k2", "k3", "k3", "k1", "k3"),  stringsAsFactors = FALSE)  

Теперь я хочу проверить, насколько я был точен при назначении конечного кластера, поэтому ожидаемый результат:

 clust lt_clust rate  lt;fctgt; lt;fctgt; lt;dblgt; 1 k1 k1 0.8 2 k1 k2 0.2 3 k1 k3 0 4 k2 k1 0.2 5 k2 k2 0.6 6 k2 k3 0.2 7 k3 k1 0.25 8 k3 k2 0 9 k3 k3 0.75  

Это была моя первая попытка:

 dataset %gt;%   mutate(clust = as.factor(clust),  lt_clust = as.factor(lt_clust),  tick = 1) %gt;%  group_by(clust, lt_clust, .drop = FALSE) %gt;%  summarise(total = sum(tick)) %gt;%  ungroup() %gt;%  group_by(clust, ) %gt;%  summarise(rate = total / sum(total))  

Но мне не удается захватить столбец lt_clust:

 clust rate  lt;fctgt; lt;dblgt; 1 k1 0.8  2 k1 0.2  3 k1 0  4 k2 0.2  5 k2 0.6  6 k2 0.2  7 k3 0.25 8 k3 0  9 k3 0.75  

И когда я пытаюсь это сделать, результат тоже неправильный:

 dataset %gt;%   mutate(clust = as.factor(clust),  lt_clust = as.factor(lt_clust),  tick = 1) %gt;%  group_by(clust, lt_clust, .drop = FALSE) %gt;%  summarise(total = sum(tick),  rate = total / sum(total))   clust lt_clust total rate  lt;fctgt; lt;fctgt; lt;dblgt; lt;dblgt; 1 k1 k1 4 1 2 k1 k2 1 1 3 k1 k3 0 NaN 4 k2 k1 1 1 5 k2 k2 3 1 6 k2 k3 1 1 7 k3 k1 1 1 8 k3 k2 0 NaN 9 k3 k3 3 1  

Пожалуйста, не могли бы вы помочь мне определить, что я делаю не так в коде? Я пытаюсь сделать это с помощью пакета dplyr.

Ответ №1:

С вашей первой попытки просто добавьте lt_clust в summarise() :

 dataset %gt;%   mutate(clust = as.factor(clust),  lt_clust = as.factor(lt_clust),  tick = 1) %gt;%  group_by(clust, lt_clust, .drop = FALSE) %gt;%  summarise(total = sum(tick)) %gt;%  ungroup() %gt;%  group_by(clust, ) %gt;%  summarise(lt_clust, rate = total / sum(total))  # A tibble: 9 × 3 # Groups: clust [3]  clust lt_clust rate  lt;fctgt; lt;fctgt; lt;dblgt; 1 k1 k1 0.8  2 k1 k2 0.2  3 k1 k3 0  4 k2 k1 0.2  5 k2 k2 0.6  6 k2 k3 0.2  7 k3 k1 0.25 8 k3 k2 0  9 k3 k3 0.75  

Комментарии:

1. Я протестировал решение, и оно отлично работает. Спасибо за ваше время и ответ @Josh Gray