2016-09-28 2 views
1

Je ne trouve pas un jeu de données similaire à mon problème, j'ai donc modifié l'ensemble de données Iris (jeu de données dans R) pour qu'il soit similaire - assez proche!Imbrication d'un SUM et d'un MEAN dans un agrégat pour obtenir des scores par groupe

data = iris 
data$type = gl(5,30,150,labels=c("group1","group2","group3","group4","group5")) 
data$ID = gl(30,5,150) 

J'ai ensuite utilisé le code suivant

xtabs(Sepal.Length ~ Species + type, aggregate(Sepal.Length ~ Species + type + ID, data, mean)) 

qui se traduit par

type 
Species  group1 group2 group3 group4 group5 
    setosa  30.16 19.90 0.00 0.00 0.00 
    versicolor 0.00 12.20 35.88 11.28 0.00 
    virginica 0.00 0.00 0.00 26.24 39.64 

je crois comprendre que ce que fait mon code est l'addition Sepal.Length pour chaque ID puis prendre la moyenne de ces valeurs par espèce et type.

Est-ce correct?

Sinon, comment pourrais-je l'obtenir?

De plus, comment pourrais-je obtenir ceci si mes données sont telles que chaque ID a plusieurs types? (Ne peut pas comprendre comment construire cela dans R)

En fait, juste pour être parfaitement clair

Ce que je veux est un code qui résume l'ensemble Sepal.Length pour chaque ID et le type alors il faudra la moyenne de ces sommes sur tous les ID et afficher une Sepal.Length moyenne par type et des espèces/

Répondre

1

Avec data.table:

library(data.table) 
setDT(data) 

#sum of Sepal.Length for each ID AND type 
data[, id_type_sum := sum(Sepal.Length), by = .(ID, type)] 

# mean of this variable by type and species 
data[, mean(id_type_sum), by = .(type, Species)] 

# type Species  V1 
# 1: group1  setosa 25.13333 
# 2: group2  setosa 24.87500 
# 3: group2 versicolor 30.50000 
# 4: group3 versicolor 29.90000 
# 5: group4 versicolor 28.20000 
# 6: group4 virginica 32.80000 
# 7: group5 virginica 33.03333 

et si vous voulez que cela sous forme de tableau, vous pouvez utiliser data.table « s dcast Méthode:

library(magrittr) # for the %>% operator 
data[, mean(id_type_sum), by = .(type, Species)] %>% 
    dcast(Species ~ type) 

Résultat:

 Species group1 group2 group3 group4 group5 
1:  setosa 25.13333 24.875  NA  NA  NA 
2: versicolor  NA 30.500 29.9 28.2  NA 
3: virginica  NA  NA  NA 32.8 33.03333 
+1

J'ai utilisé ce code sur mes données réelles et les chiffres semblent comme je m'y attendais! Merci beaucoup c'est super –

+0

De rien! 'data.table' est un excellent paquet – arvi1000