2015-08-12 4 views
1

Я пытаюсь сделать простой table после того, как у меня есть данные, но с использованием dplyr.Подсчет числа значений на расплавленные данные с использованием dplyr

Мои данные выглядят как этот

cluster 21:30 21:45 
4  c alone alone 
6  b  %  % 
12  e partner partner 
14  b partner partner 
20  b alone alone 
22  c partner partner 

С table я могу просто

table(dta$cluster) 
    a b c d e 
    2 8 5 1 4 

Как я могу получить те же результаты, используя melt и summarise?

library(dplyr) 
library(reshape2) 

dta %>% 
melt(id.vars = 'cluster') %>% 
group_by(cluster) %>% 
summarise(n()) 

Что мне нужно именно это table кластеры после того, расплавить данные.

Так правильно считать это data.frame

dta %>% 
melt(id.vars = 'cluster') 

Ожидаемый выход это один

 cluster variable value n_cluster 
1  a 21:30  .   2 
2  a 21:30 nuclear   2 
3  a 21:45  .   2 
4  a 21:45 nuclear   2 
5  b 21:30  %   8 
6  b 21:30 partner   8 
7  b 21:30 alone   8 
8  b 21:30 partner   8 
9  b 21:30 partner   8 
10  b 21:30 nuclear   8 
11  b 21:30 partner   8 
12  b 21:30 partner   8 
13  b 21:45  %   8 
14  b 21:45 partner   8 
15  b 21:45 alone   8 
16  b 21:45 partner   8 
17  b 21:45 partner   8 
18  b 21:45 nuclear   8 
19  b 21:45 partner   8 
20  b 21:45 partner   8 
21  c 21:30 alone   5 
22  c 21:30 partner   5 
23  c 21:30  %   5 
24  c 21:30 partner   5 
25  c 21:30 partner   5 
26  c 21:45 alone   5 
27  c 21:45 partner   5 
28  c 21:45  %   5 
29  c 21:45 partner   5 
30  c 21:45 partner   5 
31  d 21:30 partner   1 
32  d 21:45 alone   1 
33  e 21:30 partner   4 
34  e 21:30 nuclear   4 
35  e 21:30 nuclear   4 
36  e 21:30 nuclear   4 
37  e 21:45 partner   4 
38  e 21:45 nuclear   4 
39  e 21:45 nuclear   4 
40  e 21:45 nuclear   4 

Любая идея?

dta = structure(list(cluster = structure(c(3L, 2L, 5L, 2L, 2L, 3L, 
5L, 3L, 1L, 3L, 1L, 2L, 5L, 3L, 2L, 2L, 2L, 2L, 4L, 5L), .Label = c("a", 
"b", "c", "d", "e"), class = "factor"), `21:30` = structure(c(2L, 
7L, 5L, 5L, 2L, 5L, 4L, 7L, 1L, 5L, 4L, 5L, 4L, 5L, 5L, 4L, 5L, 
5L, 5L, 4L), .Label = c(".", "alone", "children", "nuclear", 
"partner", "*", "%"), class = "factor"), `21:45` = structure(c(2L, 
7L, 5L, 5L, 2L, 5L, 4L, 7L, 1L, 5L, 4L, 5L, 4L, 5L, 5L, 4L, 5L, 
5L, 2L, 4L), .Label = c(".", "alone", "children", "nuclear", 
"partner", "*", "%"), class = "factor")), .Names = c("cluster", 
"21:30", "21:45"), row.names = c("4", "6", "12", "14", "20", 
"22", "23", "28", "30", "32", "36", "38", "40", "42", "44", "48", 
"50", "56", "57", "60"), class = "data.frame") 
+2

расплава {reshape2} –

+0

да да да жаль – giacomo

+0

вы не; т нужно расплавить, и у вас есть свой ответ: 'ДТА%>% group_by (кластер)%>% реферирования (п())' – jeremycg

ответ

6

Я не могу найти хорошую простофилю для этого, но простой dplyr идиома будет только с помощью count

count(dta, cluster) 
# Source: local data frame [5 x 2] 
# 
# cluster n 
# 1  a 2 
# 2  b 8 
# 3  c 5 
# 4  d 1 
# 5  e 4 

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

dta %>% 
    melt(id.vars = 'cluster') %>% 
    left_join(., count(dta, cluster)) %>% 
    arrange(cluster) 
# cluster variable value n 
# 1  a 21:30  . 2 
# 2  a 21:30 nuclear 2 
# 3  a 21:45  . 2 
# 4  a 21:45 nuclear 2 
# 5  b 21:30  % 8 
# 6  b 21:30 partner 8 
# 7  b 21:30 alone 8 
#... 
+1

Спасибо Дэвиду за помощь! – giacomo

+0

Я понимаю, что результат не тот, который ожидался. Потому что мне нужно сначала расплавиться, а потом посчитать. 'dta%>% melt (id.vars = 'cluster')%>% count (cluster)', но это не дает мне правильный результат. Благодарю. – giacomo

+0

См. Мое редактирование о том, как легко совместить этот результат с вашим расплавленным набором данных –

1

При подсчете распределения переменной для повторных наблюдений следует учитывать количество наблюдений.

В этом примере

n_episode = 2 

Затем код становится простым

dta %>% 
    melt(id.vars = 'cluster') %>% 
    group_by(cluster) %>% 
    mutate(n_cluster = n()/n_episode) %>% 
    arrange(cluster) 

Можно использовать этот результат (n_episode) для расчета означает для групп различных размеров, например.