2017-07-19 2 views
0

Je cherche à remodeler un dataframe de quelque chose qui ressemble à ceci, avec des variables:dataframe globale dans une table de fréquence

Year, University, Degree, Gender 

chaque ligne représentant une entrée d'un étudiant, par exemple:

2017, University College London, Social Science, Male 

2017, University of Leeds, Social science, Non-Binary 

Je voudrais créer une table de fréquence à partir de ces données afin de condenser le nombre de rangées de sorte que pour chaque université, il y ait 19 rangées pour chacune des catégories, puis pour chaque degré, le nombre/fréquence pour chaque le sexe est montré, ce qui ressemblerait à quelque chose comme ça.

Year University Degree [Gender (Male, Female, Non-Binary)] 

2017 UCL Biological Sciences 1 0 2 

J'espère que cela a du sens. Merci pour l'aide.

EDIT: Je voudrais maintenant pouvoir tracer ces données sous la forme d'un graphique linéaire en utilisant un sous-ensemble de données. Je suis actuellement en dehors de la sous-ensembles fonction de traçage comme si

subsetucl <- TFtab[which(TFtab$University == 'University College London'),] 
ggplot(data=subsetucl, aes(x=Year, y=Female, group=Degree, color = Degree)) + geom_line()+ geom_point(size = 0.8) + xlab("Year of application") + ylab("Frequnecy of Females") + ggtitle("UCL Applications by Degree (2011-2017)") + theme_bw() 

Quelle est la meilleure façon de sous-ensemble des données dans la fonction de traçage et comment les meilleures lignes d'affichage pour tous les genres plutôt que les fréquences que femelles. Merci

Répondre

1

Voici une solution très complète avec dplyr. Mais utilisez sérieusement la fonction de recherche lors du débordement de la pile.

library("dplyr") 
data %>% 
    group_by(University, Degree, Gender) %>% 
    count()%>% 
    spread(key = Gender, value = n, fill = 0) 

Here's a book to help with R

+0

Ceci est utile, mais les fréquences pour le sexe sont tous dans une colonne plutôt que des colonnes distinctes pour chaque niveau de genre. Cela supprime également 0 valeurs. Existe-t-il un moyen de conserver les valeurs 0 également? –

+1

'data%>% group_by (Université, Degré, Sexe)%>% count()%>% spread (clé = Sexe, valeur = n, remplissage = 0)' – svenhalvorson

+0

Cela ajoute 0s pour les lignes avec des valeurs dans mais pour les lignes entières avec 0 il n'y a pas de ligne. Y a-t-il un moyen de le faire [email protected] –

0

1) aggregate/model.matrix Essayez cette solution d'agrégat sur une ligne. Aucun paquet n'est utilisé.

aggregate(model.matrix(~ Gender + 0) ~ Year + University + Degree, DF, sum) 

donne:

Year    University   Degree GenderFemale GenderMale GenderNon-Binary 
1 2017  University of Leeds Social science   1   0    1 
2 2017 University College London Social Science   0   1    0 

2) global/cbind Il serait également possible d'écrire la partie model.matrix(...) en utilisant cbind(...) comme ce qui peut être plus clair, bien que fastidieuse:

aggregate(cbind(Female = Gender == "Female", Male = Gender == "Male", 
      `Non-Binary` = Gender == "Non-Binary") ~ Year + University + Degree, DF, sum) 
En donnant les éléments suivants qui sont les mêmes que ci-dessus, à l'exception d'une légère variation dans les noms des colonnes:
Year    University   Degree Female Male Non-Binary 
1 2017  University of Leeds Social science  1 0   1 
2 2017 University College London Social Science  0 1   0 

Note: L'entrée utilisée dans l'exemple ci-dessus sous forme reproductible est:

Lines <- "Year, University, Degree, Gender 
2017, University College London, Social Science, Male 
2017, University of Leeds, Social science, Non-Binary 
2017, University of Leeds, Social science, Female" 
DF <- read.csv(text = Lines, strip.white = TRUE) 
+0

Cela ne semble pas fonctionner pour moi –

+0

En supposant que "ne semble pas fonctionner" signifie que vous voulez juste agréger les valeurs plutôt que d'avoir une table n-way complète J'ai révisé la réponse pour utiliser l'agrégat. –

+0

Cela fonctionne maintenant, merci beaucoup –