#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