Colonnes de nom dans l'agrégat dans R

Je sais que je peux * re * nommer des colonnes après avoir agrégé les données:

blubb <- aggregate(dat$two ~ dat$one, ...)
colnames(blubb) <- c("One", "Two")

Rien de mal à cela. Mais existe-t-il un moyen d'agréger et de nommer les colonnes en une seule fois? Un peu comme:

blubb <- aggregate( ... , cols = c("One", "Two"))

Il serait particulièrement agréable (et à l'épreuve des fautes de frappe) 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"))
48
demandé sur A5C1D2H2I1M1N2O1R2T1 2013-03-09 13:31:58

3 réponses

, Vous pouvez utiliser setNames, comme dans:

blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))

Vous pouvez également contourner la méthode Slick formula et utiliser une syntaxe comme:

blubb <- aggregate(list(One = dat$one), list(Two = dat$two), ...)

Mettre à jour

Cette mise à jour est juste pour vous aider à commencer à dériver 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.matrix(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'ajouter le nom de la fonction à la variable qui a été agrégée, vous pouvez peut-être le changer en quelque chose comme:

if (is.matrix(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

Fondamentalement de capture de la valeur de FUN en utilisant deparse(substitute(FUN)), de sorte que vous pouvez 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 un peu de travail, mais je ne vais pas le faire!

Voici un essentiel avec ce concept appliqué, créant une fonction nommée "myAgg".

Voici un exemple de sortie seulement de la colonne résultante les noms de:

> 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!

64
répondu A5C1D2H2I1M1N2O1R2T1 2013-03-09 11:39:59

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 de colonne d'origine. Si je l'ai trouver je vais le poster.

8
répondu orville jackson 2013-09-18 08:49:47
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)
-3
répondu rwinkel2000 2015-08-18 23:07:10