2016-02-23 2 views
2

j'ai l'data.frame suivante qui ressemble à ceci:niveaux de facteur de comptage au fil du temps

head(entries,10) 

    Provider.Region  year.start month.start day.start Provider.Status 
23511  North West  0010   05  17 Deregistered (V) 
23512  North West  0010   05  17 Deregistered (V) 
23709 West Midlands  0010   06  01  Registered 
23562   London  0010   06  10  Registered 
23563   London  0010   06  10  Registered 
23566   London  0010   06  10  Registered 
23764 West Midlands  0010   06  10 Deregistered (V) 
23508   London  0010   06  11 Deregistered (V) 
23555 West Midlands  0010   06  11  Registered 
23497  South East  0010   06  14 Deregistered (V) 

Je veux compter le niveau de facteur correspondant à Provider.Status sur une base mensuelle. Ma sortie désirée devrait être quelque chose comme ceci:

head(entries.1, 3) 

time region  Deregistered (V) Registered 
5-0010 North West  2    0 
6-0010 West Midlands  2    1 
6-0010 London   1    3 

Au moment où je l'ai utilisé dplyr comme suit

library(dplyr) 
entries %>% 
    group_by(Provider.Region, year.start, month.start) %>% 
    mutate(counts_status = n()) 

Mais encore ne donne pas mon résultat attendu car il donne quelque chose comme:

Source: local data frame [23,775 x 6] 
Groups: Provider.Region, year.start, month.start [606] 

Provider.Region year.start month.start Provider.Status counts_status 
(fctr)  (fctr)  (fctr)    (fctr)   (int) 
1  North West  0010   05 Deregistered (V)  2 
2  North West  0010   05 Deregistered (V)  2 
3 West Midlands  0010   06 Registered   4 
4   London  0010   06 Registered   7 
5   London  0010   06 Registered   7 
6   London  0010   06 Registered   7 
7 West Midlands  0010   06 Deregistered (V)  4 
8   London  0010   06 Deregistered (V)  7 
9 West Midlands  0010   06 Registered   4 
10  South East  0010   06 Deregistered (V)  10 
..    ...  ...   ...  ...    ... 

Existe-t-il un moyen compact de créer des variables à partir des comptages? Un grand merci à l'avance

+0

peut vous ajouter un 'dput (tête (entrées, 10))' à votre question? (sera plus facile de reproduire votre jeu de données) – Tensibai

+0

Vous pourriez trouver 'table (DF $ Provider.Region, DF $ Provider.Status)' utile après agrégation au besoin. –

+0

@akrun Je pense que c'est probablement dupe, mais pas de cette question. Le remodelage consiste généralement à réarranger les données, et non à calculer les statistiques récapitulatives (comme les décomptes). De toute façon, je vais me désunir pour le moment. Espérons que quelqu'un fasse l'effort de trouver une dupe appropriée plus tard. – Frank

Répondre

2

Ceci peut être réalisé en utilisant la fonction dcast de la reshape2 ou data.table packages:

library(reshape2) 
dcast(mydf, paste(year.start,month.start,sep="-") + Provider.Region ~ Provider.Status) 

library(data.table) 
dcast(setDT(mydf), paste(year.start,month.start,sep="-") + Provider.Region ~ Provider.Status) 

la sortie du dernier:

year.start Provider.Region Deregistered(V) Registered 
1: 0010-05  NorthWest    2   0 
2: 0010-06   London    1   3 
3: 0010-06  SouthEast    1   0 
4: 0010-06 WestMidlands    1   2 

Lorsque vous utilisez le code ci-dessus, vous obtiendrez un message d'avertissement:

Using 'Provider.Status' as value column. Use 'value.var' to override 
Aggregate function missing, defaulting to 'length' 

Cela n'a pas d'incidence, mais pour éviter que vous pouvez spécifier la value.var et la fonction d'agrégation:

dcast(setDT(mydf), 
     paste(year.start,month.start,sep="-") + Provider.Region ~ Provider.Status, 
     value.var = "Provider.Status", fun.aggregate = length) 
+0

Merci @Jaap. C'est exactement ce dont j'avais besoin. Pour moi 'data.table' fonctionne mieux que' reshape' car il conserve les noms des variables. À votre santé – Edu

1

Vous pouvez utiliser le package reshape2 pour produire une telle table:

library(reshape2) 
d <- data.frame(region=rep(c("A", "B", "C"), each=2), timepoint = c(1, 1, 1, 1, 2, 2), provider=rep(c("D", "R"), 3), count_status = 1:6) 
dcast(d, region + timepoint ~ provider, value.var = "count_status") 

pour obtenir cette sortie:

region timepoint D R 
1  A   1 1 2 
2  B   1 3 4 
3  C   2 5 6 
+0

Bon usage de reshape. Un de plus. – akrun