web-dev-qa-db-fra.com

compter le nombre de lignes dans un cadre de données dans R basé sur le groupe

J'ai un cadre de données dans R comme ceci:

  ID   MONTH-YEAR   VALUE
  110   JAN. 2012     1000
  111   JAN. 2012     2000
         .         .
         .         .
  121   FEB. 2012     3000
  131   FEB. 2012     4000
         .           .
         .           .

Donc, pour chaque mois de chaque année, il y a n rangées et elles peuvent être dans n'importe quel ordre (signifient qu'elles ne sont pas toutes dans la continuité et sont à la pause). Je veux calculer le nombre de lignes pour chaque MONTH-YEAR c'est-à-dire le nombre de lignes pour JAN. 2012, combien pour la FEB. 2012 et ainsi de suite. Quelque chose comme ça:

 MONTH-YEAR   NUMBER OF ROWS
 JAN. 2012     10
 FEB. 2012     13
 MAR. 2012     6
 APR. 2012     9

J'ai essayé de faire ceci:

n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))

mais cela ne produit pas le résultat souhaité. Comment puis-je le faire?

36
Jason Donnald

Voici un exemple qui montre comment table(.) (ou, plus précisément, à la sortie souhaitée, data.frame(table(.)) fait ce que vous semblez demander.

Notez également comment partager des exemples de données reproductibles de manière à ce que d'autres puissent les copier et les coller dans leur session.

Voici les exemples de données (reproductibles):

mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))

mydf
#    ID MONTH.YEAR VALUE
# 1 110  JAN. 2012  1000
# 2 111  JAN. 2012  2000
# 3 121  FEB. 2012  3000
# 4 131  FEB. 2012  4000
# 5 141  MAR. 2012  5000

Voici le calcul du nombre de lignes par groupe, dans deux formats d'affichage en sortie:

table(mydf$MONTH.YEAR)
# 
# FEB. 2012 JAN. 2012 MAR. 2012 
#         2         2         1

data.frame(table(mydf$MONTH.YEAR))
#        Var1 Freq
# 1 FEB. 2012    2
# 2 JAN. 2012    2
# 3 MAR. 2012    1
31

La fonction count() dans plyr fait ce que vous voulez:

library(plyr)

count(mydf, "MONTH-YEAR")
41
Head

En utilisant l'exemple de jeu de données qu'Ananda a créé, voici un exemple utilisant aggregate(), qui fait partie du noyau R. aggregate() n'a besoin que d'un élément à compter en fonction des différentes valeurs de MONTH-YEAR. Dans ce cas, j'ai utilisé VALUE comme élément à compter:

aggregate(cbind(count = VALUE) ~ MONTH.YEAR, 
          data = mydf, 
          FUN = function(x){NROW(x)})

ce qui vous donne ..

  MONTH.YEAR count
1  FEB. 2012     2
2  JAN. 2012     2
3  MAR. 2012     1
11
Andy Clifton

Essayez d’utiliser la fonction count dans dplyr:

library(dplyr)
dat1_frame %>% 
    count(MONTH.YEAR)

Je ne sais pas comment vous avez obtenu MOIS-ANNÉE comme nom de variable. Ma version R ne permettant pas un tel nom de variable, je l'ai donc remplacée par MONTH.YEAR.

En guise de remarque, l'erreur dans votre code était que dat1_frame %.% group_by(MONTH-YEAR) sans la fonction summarise renvoie le bloc de données d'origine sans aucune modification. Donc, vous voulez utiliser

dat1_frame %>%
    group_by(MONTH.YEAR) %>%
    summarise(count=n())
6
Kate
library(plyr)
ddply(data, .(MONTH-YEAR), nrow)

Cela vous donnera la réponse si "MOIS-ANNÉE" est une variable. Commencez par essayer unique (data $ MONTH-YEAR) et voyez si elle renvoie des valeurs uniques (pas de doublons).

Ensuite, ci-dessus, un simple split-apply-combine retournera ce que vous recherchez.

5
won782

Juste pour compléter la solution data.table:

library(data.table)

mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))

setDT(mydf)
mydf[, .(`Number of rows` = .N), by = MONTH.YEAR]

   MONTH.YEAR Number of rows
1:  JAN. 2012              2
2:  FEB. 2012              2
3:  MAR. 2012              1
3
User2321

Supposons que nous ayons un cadre de données df_data comme ci-dessous

> df_data
   ID MONTH-YEAR VALUE
1 110   JAN.2012  1000
2 111   JAN.2012  2000
3 121   FEB.2012  3000
4 131   FEB.2012  4000
5 141   MAR.2012  5000

Pour compter le nombre de lignes dans df_data groupées par colonne MONTH-YEAR, vous pouvez utiliser:

> summary(df_data$`MONTH-YEAR`)

FEB.2012 JAN.2012 MAR.2012 
   2        2        1 

enter image description here La fonction summary créera une table à partir de l'argument facteur, puis créera un vecteur pour le résultat (lignes 7 et 8)

0
Tung Nguyen

Voici une autre façon d'utiliser aggregate pour compter les lignes par groupe:

my.data <- read.table(text = '
    month.year    my.cov
      Jan.2000     Apple
      Jan.2000      pear
      Jan.2000     Peach
      Jan.2001     Apple
      Jan.2001     Peach
      Feb.2002      pear
', header = TRUE, stringsAsFactors = FALSE, na.strings = NA)

rows.per.group  <- aggregate(rep(1, length(my.data$month.year)),
                             by=list(my.data$month.year), sum)
rows.per.group

#    Group.1 x
# 1 Feb.2002 1
# 2 Jan.2000 3
# 3 Jan.2001 2
0
Mark Miller