J'ai un dataframe et je voudrais compter le nombre de lignes dans chaque groupe. J'utilise régulièrement la aggregate
fonction pour additionner les données comme suit:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Maintenant, j'aimerais compter les observations mais je n'arrive pas à trouver le bon argument pour FUN
. Intuitivement, j'ai pensé que ce serait comme suit:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Mais pas de chance.
Des idées?
Quelques données sur les jouets:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
n'a pas fonctionné pour moi , maisNROW
etlength
a bien fonctionné. +1Réponses:
Les meilleures pratiques actuelles (tidyverse) sont:
la source
cbind
les résultats deaggregate(Sepal.Length ~ Species, iris, mean)
etaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Suite à la suggestion de @ Joshua, voici une façon de compter le nombre d'observations dans votre base de
df
données oùYear
= 2007 etMonth
= Nov (en supposant qu'il s'agit de colonnes):et avec
aggregate
, après @GregSnow:la source
dplyr
package fait cela aveccount
/tally
commandes, ou lan()
fonction :Tout d'abord, quelques données:
Maintenant le compte:
Nous pouvons également utiliser une version légèrement plus longue avec passepoil et la
n()
fonction:ou la
tally
fonction:la source
Une vieille question sans
data.table
solution. Alors voilà ...En utilisant
.N
la source
.()
placelist()
etsetDT()
à convertir un data.frame en data.table. Donc en une seule étapesetDT(df)[, .N, by = .(year, month)]
.L'option simple à utiliser avec
aggregate
est lalength
fonction qui vous donnera la longueur du vecteur dans le sous-ensemble. Parfois un peu plus robuste est à utiliserfunction(x) sum( !is.na(x) )
.la source
Créez une nouvelle variable
Count
avec une valeur de 1 pour chaque ligne:Puis agrégez le dataframe, en additionnant par la
Count
colonne:la source
aggregate
, il n'est pas nécessaire de renommer chaque variable enby=
likelist(year=df1$year)
etc. Adata.frame
estlist
déjà un doncaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
fonctionnera.Une alternative à la
aggregate()
fonction dans ce cas seraittable()
avecas.data.frame()
, qui indiquerait également quelles combinaisons d'année et de mois sont associées à zéro occurrenceEt sans les combinaisons nulles
la source
Si vous souhaitez inclure 0 décompte pour les mois-années qui manquent dans les données, vous pouvez utiliser un peu de
table
magie.Par exemple, le jouet data.frame de la question, df1, ne contient aucune observation de janvier 2014.
La
aggregate
fonction de base R ne renvoie pas d'observation pour janvier 2014.Si vous souhaitez une observation de ce mois-année avec 0 comme décompte, le code ci-dessus renverra un data.frame avec des décomptes pour toutes les combinaisons mois-année:
la source
Pour mes agrégations, je finis généralement par vouloir voir la moyenne et "quelle est la taille de ce groupe" (aka longueur). Voici donc mon extrait de code pratique pour ces occasions;
la source
UNE sqlsolution utilisant le
sqldf
package:la source
Compte tenu de la réponse @Ben, R générerait une erreur s'il
df1
ne contient pas dex
colonne. Mais il peut être résolu avec élégance avecpaste
:De même, il peut être généralisé si plus de deux variables sont utilisées dans le regroupement:
la source
Vous pouvez utiliser des
by
fonctions carby(df1$Year, df1$Month, count)
cela produira une liste d'agrégation nécessaire.La sortie ressemblera à,
la source
Il y a déjà beaucoup de réponses merveilleuses ici, mais je voulais ajouter une option supplémentaire pour ceux qui souhaitent ajouter une nouvelle colonne à l'ensemble de données d'origine qui contient le nombre de fois que cette ligne est répétée.
La même chose pourrait être accomplie en combinant l'une des réponses ci-dessus avec la
merge()
fonction.la source
Si vous essayez les solutions globales ci-dessus et que vous obtenez l'erreur:
type (liste) non valide pour la variable
Étant donné que vous utilisez des horodatages de date ou de date / heure, essayez d'utiliser as.character sur les variables:
Sur une ou les deux variables.
la source