2017-08-29 3 views
0

Dans chaque groupe, je veux trouver la moyenne pour deux sous-groupes. Pour être clair, les données se présente comme suit:Trouver la moyenne dans chaque groupe

Group Val1 Val2 Val3 
1  50 0.03 50.1 
1  50.2 0.05 50.1 
2  50.3 0.01 50.1 
1  50 0.03 50.2 
1  50.1 0.04 50.2 
1  50 0.01 50.3 
1  50 0.02 50.3 
2  50.3 0.03 50.3 

Au sein de chaque groupe Val3, je veux calculer la moyenne des Val2 dans le groupe 1 et la moyenne des Val2 dans le groupe 2. Dans certains cas, pour Val3 , il n'y a aucun membre dans le groupe 2. C'est le code que j'ai essayé.

fileB.mean.dat <- tapply(combined.sorted.data[combined.sorted.data[,1] == 2,3], combined.sorted.data[combined.sorted.data[,1] == 2,4], mean) 

Je ne sais pas comment inclure dans le code ci-dessus pour vérifier si des membres du groupe 2 et sinon pour faire la moyenne 0 pour Val 3. En d'autres termes, il devrait y avoir un représentant valeur moyenne pour le groupe 1 et 2 pour chaque valeur de Val 3.

+1

'agrégé (Val2 ~ Groupe + Val3, données = df, moyenne)' donnera la moyenne par groupe. Mais ne vous donnera pas le "manquant" moyen (et je ne suis pas entièrement sûr de l'avantage d'avoir une moyenne pour les données qui n'existe pas?) – SymbolixAU

+0

Je veux tracer les données. Par conséquent, je veux avoir le moyen de montrer dans l'intrigue (même si la moyenne est de 0 pour les données manquantes). – user2657817

+3

ayant une moyenne de zéro pour les données manquantes est encore assez trompeur. – zacdav

Répondre

3

Vous pouvez utiliser dcast de reshape2 pour convertir la sortie de SymbolixAU's answer à votre goût.

library(reshape2) 
dcast(data = aggregate(Val2 ~ Group + Val3, data = df, mean), 
     formula = Group~Val3, 
     value.var = "Val2") 
# Group 50.1 50.2 50.3 
#1  1 0.04 0.035 0.015 
#2  2 0.01 NA 0.030 

Ou vous pourriez le faire dans la base R aussi, mais serait relativement plus complexe

sapply(split(df[c("Group", "Val2")], df$Val3), 
     function(a) sapply(unique(df$Group), 
      function(x) setNames(mean(a$Val2[a$Group == x]), x))) 
# 50.1 50.2 50.3 
#1 0.04 0.035 0.015 
#2 0.01 NaN 0.030 

DONNÉES

df = structure(list(Group = c(1, 1, 5, 1, 1, 1, 1, 5), Val1 = c(50, 
50.2, 50.3, 50, 50.1, 50, 50, 50.3), Val2 = c(0.03, 0.05, 0.01, 
0.03, 0.04, 0.01, 0.02, 0.03), Val3 = c(50.1, 50.1, 50.1, 50.2, 
50.2, 50.3, 50.3, 50.3)), .Names = c("Group", "Val1", "Val2", 
"Val3"), row.names = c(NA, -8L), class = "data.frame") 
1

Nous pouvons utiliser tidyverse

library(tidyverse) 
df %>% 
    group_by(Group, Val3) %>% 
    summarise(Val2 = mean(Val2)) %>% 
    spread(Val3, Val2) 
# A tibble: 2 x 4 
# Groups: Group [2] 
# Group `50.1` `50.2` `50.3` 
#* <dbl> <dbl> <dbl> <dbl> 
#1  1 0.04 0.035 0.015 
#2  2 0.01  NA 0.030