2017-07-29 1 views
0

J'ai créé une fonction pour extraire les statistiques de base comme Moyenne, Médiane, Mode, SD, Var en fonction de ce que l'utilisateur veut. Par exemple. Si l'utilisateur veut seulement voir moyen, seul le moyen devrait être calculé. Les statistiques sont donc passées en arguments.Extraction de statistiques de base à l'aide d'agrégats dans une fonction dans R

Le code est

countfunc<-function(dset,Xaxis,Color,Groupby,AggValue){ 
    S1=select(dset,Xaxis,Color,Groupby) 
    S2=unique(S1) 

    str(S2) 
    stackval5<-aggregate(Groupby~Xaxis+Color,data=S2,FUN=AggValue) 
    return(stackval5) 
} 

countfunc(sbarr,"workclass","sex","age","mean") 

données Exemple:

> dput(head(S1,20)) 
structure(list(workclass = structure(c(8L, 7L, 5L, 5L, 5L, 5L, 
5L, 7L, 5L, 5L, 5L, 8L, 5L, 5L, 5L, 5L, 7L, 5L, 5L, 7L), .Label = c(" Federal-gov", 
" Local-gov", " NA", " Never-worked", " Private", " Self-emp-inc", 
" Self-emp-not-inc", " State-gov", " Without-pay"), class = "factor"), 
    sex = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 
    2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L), .Label = c(" Female", 
    " Male"), class = "factor"), age = c(39L, 50L, 38L, 53L, 
    28L, 37L, 49L, 52L, 31L, 42L, 37L, 30L, 23L, 32L, 40L, 34L, 
    25L, 32L, 38L, 43L)), .Names = c("workclass", "sex", "age" 
), row.names = c(NA, 20L), class = "data.frame") 

Mais quand je lance la fonction, il est de lancer une erreur « Dans mean.default (X [[i]], ...): argument n'est pas numérique ou logique: renvoyer NA "même si la colonne" age "est en Int, essayé avec la conversion numérique aussi. str de mon DF

'data.frame': 886 obs. of 3 variables: 
$ workclass: Factor w/ 9 levels " Federal-gov",..: 8 7 5 5 5 5 5 7 5 5 ... 
$ sex  : Factor w/ 2 levels " Female"," Male": 2 2 2 2 1 1 1 2 1 2 ... 
$ age  : int 39 50 38 53 28 37 49 52 31 42 ... 
Xaxis Color Groupby 
1 workclass sex  NA 

Si je coder en dur les valeurs (agrégat (âge ~ workclass + sexe, data = S1, FUN = moyenne), il fonctionne comme expected.It serait d'une grande aide si vous guider ou partager quelques réflexions sur ce que je fais mal ici. Merci à l'avance.

+0

Quelle est la sortie désirée? Si vous utilisez 'identity' au lieu de' mean', vous verrez que l'argument passé à 'mean' n'est certainement pas numérique. – Vandenman

Répondre

0

effectuez les opérations suivantes.

countfunc<-function(dset,Xaxis,Color,Groupby,AggValue){ 
    S1=select(dset,Xaxis,Color,Groupby) 
    S2=unique(S1) 

    stackval5 <- aggregate(S2[[Groupby]], list(S2[[Xaxis]], S2[[Color]]), FUN = AggValue) 
    names(stackval5) <- c(Xaxis, Color, Groupby) 
    stackval5 
} 

countfunc(sbarr,"workclass","sex","age","mean") 
      workclass  sex  age 
1   Private Female 33.60000 
2 Self-emp-not-inc Female 43.00000 
3   Private Male 39.42857 
4 Self-emp-not-inc Male 42.33333 
5   State-gov Male 34.50000 

ce que vous faisiez mal était la formule. aggregate recherchait les valeurs des variables Xaxis , Color et Groupby, qui étaient respectivement "workclass", "sex" et "age". Puisque la valeur "age" n'est ni numérique ni logique, elle retournera NA. (Cela ferait mean("age") et renverrait NA.)

+0

Merci beaucoup .. Je suis toujours là pour moi :) A bientôt .. Si ce n'est pas trop demander, Pourriez-vous s'il vous plaît partager ce que j'ai fait de mal? Comment cette erreur apparaît .. Merci encore pour votre temps. –

+0

@LeninS Voir ma modification à la réponse. –

+0

Oh..Ma mauvais, je pensais que placer directement les arguments apporterait aussi les valeurs.Il semble, j'ai manqué celui-là. très appréciée :) –