dplyr join предупреждение: объединяющие факторы с разными уровнями
При использовании функции соединения в dplyr
пакет, я получаю это предупреждение:
Warning message:
In left_join_impl(x, y, by$x, by$y) :
joining factors with different levels, coercing to character vector
В интернете не так много информации об этом. Есть идеи, что это может быть? Спасибо!
3 ответа
Это не ошибка, это предупреждение. И это говорит вам, что один из столбцов, который вы использовали в своем объединении, был фактором, и этот фактор имел разные уровни в разных наборах данных. Чтобы не потерять какую-либо информацию, факторы были преобразованы в символьные значения. Например:
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"
Вы можете убедиться, что оба фактора имеют одинаковые уровни перед объединением
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"
Кроме того, если столбцы группировки в двух соединяющихся таблицах имеют разные порядки уровней, то также появится это предупреждение.
> 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
В случае базы данных, не забудьте stringsAsFactors=FALSE
во многих случаях, чтобы избежать этого предупреждения. (Это был мой случай).
sqlExecute(my_database_channel, data=myparam, stringsAsFactors=FALSE )