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?
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
La fonction count()
dans plyr
fait ce que vous voulez:
library(plyr)
count(mydf, "MONTH-YEAR")
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
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())
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.
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
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
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)
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