2017-07-19 3 views
4

J'ai un data.frame avec des colonnes de facteurs, sur lesquels je veux calculer un max (ou min, ou quantiles). Je ne peux pas utiliser ces fonctions sur des facteurs, mais je le veux.Agréger avec max et facteurs

est Voici quelques exemples:

set.seed(3) 
df1 <- data.frame(id = rep(1:5,each=2),height=sample(c("low","medium","high"),size = 10,replace=TRUE)) 
df1$height <- factor(df1$height,c("low","medium","high")) 
df1$height_num <- as.numeric(df1$height) 
# > df1 
# id height height_num 
# 1 1 low   1 
# 2 1 high   3 
# 3 2 medium   2 
# 4 2 low   1 
# 5 3 medium   2 
# 6 3 medium   2 
# 7 4 low   1 
# 8 4 low   1 
# 9 5 medium   2 
# 10 5 medium   2 

Je peux le faire facilement:

aggregate(height_num ~ id,df1,max) 
# id height_num 
# 1 1   3 
# 2 2   2 
# 3 3   2 
# 4 4   1 
# 5 5   2 

Mais pas:

aggregate(height ~ id,df1,max) 
# Error in Summary.factor(c(2L, 2L), na.rm = FALSE) : 
# ‘max’ not meaningful for factors 

Je veux profiter de la plus grande "hauteur", et garder dans ma table agrégée les mêmes niveaux que dans la table d'origine. Dans mes données réelles, j'ai beaucoup de colonnes et je veux garder mes facteurs triés pour garder mes parcelles propres et cohérentes.

je peux le faire de cette façon, et utiliser la structure suivante dans d'autres des fonctions de groupement ainsi:

use_factors <- function(x,FUN){factor(levels(x)[FUN(as.numeric(x))],levels(x))} 
aggregate(height ~ id,df1,use_factors,max) 
# id height 
# 1 1 high 
# 2 2 medium 
# 3 3 medium 
# 4 4 low 
# 5 5 medium 

Ou je pourrais surcharger les maxminmedian et quantile fonctions, je suppose Mais je sens que je suis sûrement réinventer la roue.

Y at-il un moyen facile de faire cela?

Répondre

4

En fait, pouvez faire l'agrégation que vous voulez, si vous utilisez un facteur ordonné.

set.seed(3) 
df1 <- data.frame(id = rep(1:5,each=2),height=sample(c("low","medium","high"),size = 10,replace=TRUE)) 
df1$height <- factor(df1$height,c("low","medium","high"), ordered = TRUE) 
df1$height_num <- as.numeric(df1$height) 

aggregate(height~id, df1, max) 
    id height 
1 1 high 
2 2 medium 
3 3 medium 
4 4 low 
5 5 medium 
+0

Incroyable merci, je savais que ça devait être facile! Il est assez trompeur que l'erreur indique «max» non significatif pour les facteurs » –

+0

Oui. Ce message pourrait être plus utile. – G5W