2012-11-02 44 views
10

Đây là lỗi mà tôi nhận được khi cố gắng chạy tolower() trên vectơ ký tự từ tệp không thể thay đổi (ít nhất, không phải thủ công - quá lớn).Lỗi trong chuỗi (multibyte không hợp lệ)

Error in tolower(m) : invalid multibyte string X

Nó có vẻ là tên công ty của Pháp mà là vấn đề với các nhân vật É. Mặc dù tôi đã không điều tra tất cả chúng (cũng không thể làm như vậy bằng tay).

Thật lạ lùng, bởi vì tôi nghĩ rằng các vấn đề mã hóa sẽ được xác định trong thời gian read.csv(), thay vì trong quá trình hoạt động sau khi thực tế.

Có cách nào nhanh chóng để xóa các chuỗi nhiều chuỗi này không? Hoặc, có lẽ một cách để xác định và chuyển đổi? Hoặc thậm chí chỉ cần bỏ qua chúng hoàn toàn?

+2

'ToLower ("École") 'mang lại cho tôi' "École" 'mà có vẻ đúng (tôi :-) Pháp) – flodel

+0

Câu hỏi này có thể hữu ích: http://stackoverflow.com/ question/4993837/r-invalid-multibyte-string – thelatemail

+1

Tôi cũng nên đề cập đến rằng tôi không nhận được cùng một lỗi trên Windows (hoặc ít nhất, khi tôi có Windows) –

Trả lời

16

Đây là cách tôi giải quyết vấn đề của tôi:

Đầu tiên, tôi mở các dữ liệu thô trong một texteditor (Geany, trong trường hợp này), thuộc tính nhấp và xác định kiểu Encoding.

Sau đó tôi đã sử dụng chức năng iconv().

x <- iconv(x,"WINDOWS-1252","UTF-8") 

Cụ thể hơn, tôi đã làm điều này cho mỗi cột của data.frame từ CSV đã nhập. Điều quan trọng cần lưu ý là tôi đã đặt stringsAsFactors=FALSE trong cuộc gọi read.csv() của mình.

dat[,sapply(dat,is.character)] <- sapply(
    dat[,sapply(dat,is.character)], 
    iconv,"WINDOWS-1252","UTF-8") 
4

Tôi biết điều này đã được trả lời nhưng tôi nghĩ tôi sẽ chia sẻ giải pháp của mình cho điều này khi tôi đã trải nghiệm điều tương tự.

Trong trường hợp của tôi, tôi đã sử dụng hàm str_trim() từ gói stringr để cắt khoảng trắng từ đầu và cuối chuỗi.

com$uppervar<-toupper(str_trim(com$var))

Các vấn đề liên quan