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):
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!
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))
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)))