14 votes

Niveau de facteur de combinaison dans R

Je voudrais combiner le niveau "A", "B" en "A+B". J'ai réussi à le faire en procédant comme suit :

x <- factor(c("A","B","A","C","D","E","A","E","C"))
x
#[1] A B A C D E A E C
#Levels: A B C D E
l <- c("A+B","A+B","C","D+E","D+E")
factor(l[as.numeric(x)])
#[1] A+B A+B A+B C   D+E D+E A+B D+E C  
#Levels: A+B C D+E

Y a-t-il un moyen plus trivial de le faire ? (c'est-à-dire un nom de fonction plus explicable tel que combine.factor(f, old.levels, new.levels) aiderait à mieux comprendre le code).

De plus, j'essaie de trouver une fonction bien nommée qui fonctionnerait probablement avec un cadre de données en dplyr mais pas de chance. L'implémentation la plus proche est

df %>% mutate(x = factor(l[as.numeric(x)]))

13voto

Joe Points 2572

Il est maintenant facile de le faire avec fct_collapse() de la forcats paquet.

x <- factor(c("A","B","A","C","D","E","A","E","C"))

library(forcats)
fct_collapse(x, AB = c("A","B"), DE = c("D","E"))

#[1] AB AB AB C  DE DE AB DE C 
#Levels: AB C DE

8voto

akrun Points 148302

Une option est recode de car

library(car)
recode(x, "c('A', 'B')='A+B';c('D', 'E') = 'D+E'")
#[1] A+B A+B A+B C   D+E D+E A+B D+E C  
#Levels: A+B C D+E

Il devrait également fonctionner avec dplyr

library(dplyr)
df %>%
   mutate(x= recode(x, "c('A', 'B')='A+B';c('D', 'E') = 'D+E'"))
#    x
#1 A+B
#2 A+B
#3 A+B
#4   C
#5 D+E
#6 D+E
#7 A+B
#8 D+E
#9   C

données

df <- data.frame(x)

1voto

JSteele Points 1

Et si on utilisait ifelse() pour créer un nouveau facteur ?

x = factor(c("A","B","A","C","D","E","A","E","C"))
# chained comparisons, a single '|' works on the whole vector
y = as.factor(
    ifelse(x=='A'|x=='B',
        'A+B',
        ifelse(x=='D'|x=='E','D+E','C')
    )
)
> y
[1] A+B A+B A+B C   D+E D+E A+B D+E C  
Levels: A+B C D+E

# using %in% to search
z = as.factor(
    ifelse(x %in% c('A','B'),
        'A+B',
        ifelse(x %in% c('D','E'),'D+E','C'))
)
> z
[1] A+B A+B A+B C   D+E D+E A+B D+E C  
Levels: A+B C D+E

Si vous ne voulez pas coder en dur le niveau de facteur C ci-dessus, ou si vous avez plus d'un niveau de facteur qui n'a pas besoin d'être combiné, vous pouvez utiliser ce qui suit.

# Added new factor levels
x = factor(c("A","B","A","C","D","E","A","E","C","New","Stuff","Here"))
w = as.factor(
    ifelse(x %in% c('A','B'),
        'A+B',
        ifelse(x %in% c('D','E'),
            'D+E',
            as.character(x) # without the cast it's numeric
        )
    )
)
> w
[1] A+B   A+B   A+B   C     D+E   D+E   A+B   D+E   C     New   Stuff Here
Levels: A+B C D+E Here New Stuff

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X