2015-05-26 12 views
12

Khi sử dụng chức năng tham gia trong gói dplyr, tôi nhận được cảnh báo này:dplyr tham gia cảnh báo: tham gia tố với mức độ khác nhau

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

Không có nhiều thông tin trực tuyến về vấn đề này. Bất kỳ ý tưởng những gì nó có thể được? Cảm ơn!

+2

Bạn có thể đăng mã đang tạo lỗi không? – Tor

+2

Với các lỗi như vậy, nó giúp đăng một [ví dụ tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – MrFlick

Trả lời

27

Đó không phải là lỗi, đó là cảnh báo. Và nó cho bạn biết rằng một trong các cột bạn sử dụng trong tham gia của bạn là một yếu tố và yếu tố đó có các cấp độ khác nhau trong các tập dữ liệu khác nhau. Để không mất bất kỳ thông tin nào, các yếu tố được chuyển đổi thành các giá trị ký tự. Ví dụ:

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" 

Bạn có thể chắc chắn rằng cả hai yếu tố có cùng cấp trước khi sáp nhập

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

có vẻ tốt, có nghĩa là mã là tốt để đi? Hoặc có một số chỉnh sửa tôi cần phải thực hiện để thoát khỏi cảnh báo? –

+0

Vâng, bạn có thể đảm bảo các yếu tố có cùng cấp trong mỗi tập dữ liệu trước khi tham gia. – MrFlick

+1

chúng không nên có cùng một số yếu tố. Về cơ bản tôi đang tham gia một bảng thủ tục khoảng 20.000 mã vào một tập dữ liệu có thể không có tất cả các mã thủ tục đó. –

0

Hơn nữa, nếu các cột nhóm trong bảng hai tham gia, có đơn đặt hàng mức độ khác nhau, meassage cảnh báo này cũng sẽ đến.

> 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 
Các vấn đề liên quan