web-dev-qa-db-fra.com

Récapitulation des fonctions de comptage et d'agrégation conditionnelle sur le même facteur

En résumé, j'ai des problèmes pour résumer les fonctions de comptage et d'agrégation avec des conditions relatives au même facteur.

Supposons que j'ai ce dataframe:

library(dplyr)

df = tbl_df(data.frame(
    company=c("Acme", "Meca", "Emca", "Acme", "Meca", "Emca"), 
    year=c("2011", "2010", "2009", "2011", "2010", "2013"), 
    product=c("Wrench", "Hammer", "Sonic Screwdriver", "Fairy Dust", 
              "Kindness", "Helping Hand"), 
    price=c("5.67", "7.12", "12.99", "10.99", NA, FALSE)))

qui crée cette image (en substance):

   company year  product             price
1    Acme  2011  Wrench              5.67
2    Meca  2010  Hammer              7.12
3    Emca  2009  Sonic Screwdriver   12.99
4    Acme  2011  Fairy Dust          10.99
5    Meca  2010  Kindness            NA
...  ...   ...   ...                 ...
n    Emca  2013  Helping Hand        FALSE

Supposons que je souhaite df <- group_by(df, company, year, product), puis obtenir les informations suivantes dans une seule collection (par exemple, dataframe):

  1. Compter chaque liste de prix (y compris NA, False)
  2. Nombre de chacun avec la condition 'NA'
  3. Prix ​​moyen hors NA et faux
  4. Prix ​​max

    summarize(df, count = n()) #satisfies first item obviously
    

J'ai des problèmes pour essayer d'obtenir les autres. Je pense que je dois utiliser des opérateurs de pipe? Si oui, quelqu'un peut-il fournir des conseils?

C’est ce que j’ai essayé et c’est carrément faux, mais je ne sais pas où aller ensuite:

 summarize(df,
           total.count = n(),
           count = filter(df, is.na(price)),
           avg.price = filter(df, !is.na(price), price != FALSE),
           max.price = max(filter(df, !is.na(price), price != FALSE))

Et oui, j'ai examiné la documentation et je suis sûr que les réponses sont là, mais elles sont peut-être trop avancées pour que je puisse comprendre. Merci d'avance!

39
NewRRecruit

En supposant que votre ensemble de données d'origine soit similaire à celui que vous avez créé (c'est-à-dire avec NA comme character. Vous pouvez spécifier na.strings en lisant les données avec read.table. Mais je suppose que les NA seraient détectés automatiquement.

La colonne price est factor et doit être convertie en numeric class. Quand vous utilisez as.numeric, tous les éléments non numériques (c.-à-d. "NA", FALSE) est forcé à NA) avec un avertissement.

library(dplyr)
df %>%
     mutate(price=as.numeric(as.character(price))) %>%  
     group_by(company, year, product) %>%
     summarise(total.count=n(), 
               count=sum(is.na(price)), 
               avg.price=mean(price,na.rm=TRUE),
               max.price=max(price, na.rm=TRUE))

les données

J'utilise le même dataset (sauf le ... rangée) qui a été montré.

df = tbl_df(data.frame(company=c("Acme", "Meca", "Emca", "Acme", "Meca","Emca"),
 year=c("2011", "2010", "2009", "2011", "2010", "2013"), product=c("Wrench", "Hammer",
 "Sonic Screwdriver", "Fairy Dust", "Kindness", "Helping Hand"), price=c("5.67",
 "7.12", "12.99", "10.99", "NA",FALSE)))
52
akrun