2015-05-26 9 views
12

Quando si utilizza la funzione di unire nel pacchetto dplyr, ottengo questo avvertimento:dplyr unirsi avvertimento: unendo i fattori con diversi livelli

Warning message: 
In left_join_impl(x, y, by$x, by$y) : 
    joining factors with different levels, coercing to character vector 

Non c'è un sacco di informazioni online su questo. Qualche idea di cosa potrebbe essere? Grazie!

+2

Puoi pubblicare il codice che sta producendo l'errore? – Tor

+2

Con errori come questi, aiuta a pubblicare un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – MrFlick

risposta

27

Questo non è un errore, questo è un avvertimento. E ti sta dicendo che una delle colonne che hai usato nel tuo join era un fattore e quel fattore aveva diversi livelli nei diversi set di dati. Per non perdere alcuna informazione, i fattori sono stati convertiti in valori di carattere. Ad esempio:

library(dplyr) 
x<-data.frame(a=letters[1:7]) 
y<-data.frame(a=letters[4:10]) 

class(x$a) 
# [1] "factor" 

# NOTE these are different 
levels(x$a) 
# [1] "a" "b" "c" "d" "e" "f" "g" 
levels(y$a) 
# [1] "d" "e" "f" "g" "h" "i" "j" 

m <- left_join(x,y) 
# Joining by: "a" 
# Warning message: 
# joining factors with different levels, coercing to character vector 

class(m$a) 
# [1] "character" 

È possibile fare in modo che entrambi i fattori hanno gli stessi livelli di prima fusione

combined <- sort(union(levels(x$a), levels(y$a))) 
n <- left_join(mutate(x, a=factor(a, levels=combined)), 
    mutate(y, a=factor(a, levels=combined))) 
# Joining by: "a" 
class(n$a) 
#[1] "factor" 
+1

suona bene, lo fa significa che il codice è buono per andare? O ci sono alcune modifiche che devo fare per eliminare l'avviso? –

+0

Bene, puoi assicurarti che i fattori abbiano gli stessi livelli in ogni set di dati prima del join. – MrFlick

+1

non dovrebbero avere lo stesso numero di fattori. Fondamentalmente sto unendo una tabella di procedure di circa 20.000 codici a un set di dati che potrebbe non presentare tutti quei codici di procedura. –

0

Inoltre, se le colonne di raggruppamento nella tabella due giunzione, hanno diversi ordini di livello, questo meassage avvisi arriverà anche.

> tb1 <- data_frame(a = c("a","b","c")) %>% mutate(a=as.factor(a)) 
> tb2 <- tb1 %>% mutate(a = fct_relevel(a,"c")) 
> # change table tb2's col a level order 
> tb1$a %>% class() 
[1] "factor" 
> tb2$a %>% class() 
[1] "factor" 
> tb1$a %>% levels() 
[1] "a" "b" "c" 
> tb2$a %>% levels() 
[1] "c" "a" "b" 
> tb1 %>% left_join(tb2) 
Joining, by = "a" 
Column `a` joining factors with different levels, coercing to character vector 
Problemi correlati