Je sais que je peux * re * nommer les colonnes après avoir agrégé les données:
blubb <- aggregate(dat$two ~ dat$one, ...) colnames(blubb) <- c("One", "Two")
Aucun problème avec cela. Mais y a-t-il un moyen d’agréger et de nommer les colonnes d’un coup? Un peu comme:
blubb <- aggregate( ... , cols = c("One", "Two"))
Il serait particulièrement agréable (et à la typo-proof) d’attraper les noms de colonnes d’origine et de faire comme:
blubb <- aggregate( ... , cols = c(name_of_dat$one, name_of_dat$two."_Mean"))
Vous pouvez utiliser setNames
comme dans:
blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))
Vous pouvez également ignorer la méthode de la formule slick et utiliser une syntaxe telle que:
blubb <- aggregate(list(One = dat$one), list(Two = dat$two), ...)
Cette mise à jour vise simplement à vous aider à commencer à élaborer une solution par vous-même.
Si vous inspectez le code pour stats:::aggregate.formula
, vous verrez les lignes suivantes vers la fin:
if (is.masortingx(mf[[1L]])) { lhs <- as.data.frame(mf[[1L]]) names(lhs) <- as.character(m[[2L]][[2L]])[-1L] aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) } else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
Si tout ce que vous voulez faire est d'append le nom de la fonction à la variable qui a été agrégée, vous pouvez peut-être changer cela en quelque chose comme:
if (is.masortingx(mf[[1L]])) { lhs <- as.data.frame(mf[[1L]]) names(lhs) <- as.character(m[[2L]][[2L]])[-1L] myOut <- aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) colnames(myOut) <- c(names(mf[-1L]), paste(names(lhs), deparse(substitute(FUN)), sep = ".")) } else { myOut <- aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...) colnames(myOut) <- c(names(mf[-1L]), paste(strsplit(gsub("cbind\\(|\\)|\\s", "", names(mf[1L])), ",")[[1]], deparse(substitute(FUN)), sep = ".")) } myOut
Cela capture essentiellement la valeur entrée pour FUN
en utilisant deparse(substitute(FUN))
, vous pouvez donc probablement modifier la fonction pour accepter un suffixe personnalisé, ou peut-être même un vecteur de suffixes. Cela peut probablement être amélioré un peu avec certains travaux, mais je ne vais pas le faire!
Voici un Gist avec ce concept appliqué, créant une fonction nommée "myAgg".
Voici un exemple de sortie des noms de colonne résultants :
> names(myAgg(weight ~ feed, data = chickwts, mean)) [1] "feed" "weight.mean" > names(myAgg(breaks ~ wool + tension, data = warpbreaks, sum)) [1] "wool" "tension" "breaks.sum" > names(myAgg(weight ~ feed, data = chickwts, FUN = function(x) mean(x^2))) [1] "feed" "weight.function(x) mean(x^2)"
Notez que seul le nom de la variable agrégée change. Mais notez aussi que si vous utilisez une fonction personnalisée, vous vous retrouverez avec un nom de colonne vraiment étrange!
La réponse à votre première question est oui. Vous pouvez certainement inclure les noms de colonne dans la fonction d’agrégation. En utilisant les noms de votre exemple ci-dessus:
blubb <- aggregate(dat,list(One=dat$One,Two=dat$Two),sum)
J'aime la partie sur la possibilité de tirer automatiquement les noms des colonnes d'origine. Si je le trouve, je le posterai.
w <- data.frame(Funding<-"Fully Insured",Region="North East",claim_count=rnbinom(1000, 300.503572818, mu= 0.5739467)) x <- data.frame(Funding<-"Fully Insured",Region="South East",claim_count=rnbinom(1000, 1000, mu= 0.70000000)) y <- data.frame(Funding<-"Self Insured",Region="North East",claim_count=rnbinom(1000, 400, mu= 0.80000000)) z <- data.frame(Funding<-"Self Insured",Region="South East",claim_count=rnbinom(1000, 700, mu= 1.70000000)) names(w)<-c("Funding","Region","claim_count") names(x)<-c("Funding","Region","claim_count") names(y)<-c("Funding","Region","claim_count") names(z)<-c("Funding","Region","claim_count") my_df <- rbind(w,x,y,z) my_df2<-with(my_df, aggregate(x=claim_count, by=list(Funding,Region), FUN=sum)) colnames(my_df2)<-colnames(my_df)