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 max
min
median
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?
Incroyable merci, je savais que ça devait être facile! Il est assez trompeur que l'erreur indique «max» non significatif pour les facteurs » –
Oui. Ce message pourrait être plus utile. – G5W