2017-08-19 1 views
-2

Je veux comprendre comment faire accomplir des fonctionnalités "group by" et "count" dans le tidyverse. J'ai regardé quelques articles sans trouver tout à fait ce que je voulais; s'il y a une réponse à ce déjà posté, j'apprécierais le lien. Par exemple, je suis à la recherche de valeurs aberrantes dans les données; Je veux savoir quels endroits ont reçu le plus de mesures « mauvais »:Y at-il un équivalent tidyverse à SELECT ... COUNT (*) ... GROUP BY ...?

place = rep(c('AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI'), times=4) 
measure = rep(c('meas1','meas2','meas3','meas4'), each=11) 
set.seed(200) 
rating = sample(c('good','bad'), size = 44, prob=c(2,1), replace=T) 
df = data.frame(place, measure, rating) 

> df 
    place measure rating 
1  AL meas1 good 
2  AK meas1 good 
3  AZ meas1 good 
4  AR meas1 bad 
5  CA meas1 bad 
6  CO meas1 bad 
7  CT meas1 bad 
8  DE meas1 good 
9  FL meas1 good 
10 GA meas1 good 
     ....(etc)..... 

Je veux comprendre comment faire en utilisant le tidyverse. Cette approche à l'aide sqldf me donne ce que je veux, ce me dit quels endroits avait le plus la cote « mauvais », et classe les lieux par leur « mauvais-ness »

library(sqldf)  
sqldf("SELECT place, rating, COUNT(*) AS Count FROM df GROUP BY place, rating ORDER BY rating, count DESC"). 

    place rating Count 
1  CA bad  3 
2  AK bad  2 
3  AR bad  1 
4  CO bad  1 
5  CT bad  1 
6  DE bad  1 
7  FL bad  1 
8  GA bad  1 
9  AL good  4 
10 AZ good  4 
11 HI good  4 
    ....(etc).... 

est-il un moyen de faire obtenir des résultats similaires dans le tidyverse?

+1

Essayez 'df%>% count (lieu, note)%>% arranger (note, desc (n))' –

+0

pouvez-vous expliquer ou déplier un peu? ça fait certainement ce que j'espérais. – cumin

+3

Essayez '? Count','? Arranger 'et '? Desc'. Lire le manuel pourrait vous aider à apprendre une chose ou deux en cours de route –

Répondre

1

Pour une introduction à ces opérations de base dans le tidyverse, je vous suggère de lire Wickham et un excellent R de Grolemund pour la science des données en première instance: http://r4ds.had.co.nz/

Vous pouvez utiliser des packages de dplyr et magrittr faire la suivant dans un format facile à suivre manière:

# Install the tidyverse 
library(tidyverse) 

# Create data 
place = rep(c('AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI'), times=4) 
measure = rep(c('meas1','meas2','meas3','meas4'), each=11) 
set.seed(200) 
rating = sample(c('good','bad'), size = 44, prob=c(2,1), replace=T) 
df = data.frame(place, measure, rating) 

# Do some analysis 
df %>% 
    group_by(place) %>% 
    summarise(mean_score = mean(rating == "good"), n = n()) %>% 
    arrange(desc(mean_score)) 

ici, nous « groupe par » nom du restaurant « puis » « résumons » chaque groupe par le nombre moyen des notes « bonnes » qu'il a reçu (la création d'une nouvelle variable), "then" "arranger" la sortie dans l'ordre décroissant par this 'mean_sco ré'. Nous créons également la nouvelle variable 'n' dans la fonction de résumé qui compte le nombre d'évaluations sur lesquelles chaque moyenne est basée (c.-à-d. Que si nous voyons qu'un restaurant a seulement 2 évaluations, nous saurons que la moyenne peut ne pas être représentatif: voir http://www.evanmiller.org/how-not-to-sort-by-average-rating.html pour un exemple complet de ceci).

+1

Ceci est une bonne réponse, mais je ne suis pas sûr de la légalité de votre premier lien. –

+0

Que voulez-vous dire par la légalité du lien? Ceci est une citation non commerciale, nommée de matériel open source sous licence Creative Commons Attribution-NonCommercial-NoDerivs 3.0 – prestono

+0

Désolé, vous avez raison, c'est bien. Le site ne chargeait pas pour moi, et j'ai vérifié et vu que le livre est vendu dans les magasins, donc j'avais supposé que c'était une copie de pirate. –