2015-03-25 26 views
14

Tôi đã nhập một chuỗi văn bản trong tệp .csv, bao gồm các ký hiệu unicode là: \U00B5 g/dL. Trong .csv tập tin cũng như đọc trong khung dữ liệu R:In chuỗi ký tự unicode trong R

enter image description here

test=read.csv("test.csv") 

enter image description here

\U00B5 sẽ tạo ra các sign- vi μ. R đọc nó vào tập tin dữ liệu như nó là (\U00B5). Tuy nhiên khi tôi in chuỗi nó hiển thị là \\U00B5 g/dL.
Cách khác, nhập thủ công mã hoạt động tốt.

varname <- c("a", "b", "c") 
labels <- c("A \U00B5 g/dL", "B \U00B5 g/dL", "C \U00B5 g/dL") 
df <- data.frame(varname, labels) 
test <- data.frame(varname, labels) 
test 
# varname labels 
# 1  a A µ g/dL 
# 2  b B µ g/dL 
# 3  c C µ g/dL 

Tôi tự hỏi làm thế nào tôi có thể loại bỏ ký hiệu thoát \ trong trường hợp này và in ra biểu tượng. Hoặc nếu có cách khác để in biểu tượng trong R.

Cảm ơn bạn rất nhiều vì đã giúp đỡ!

+0

Khi bạn nói, * Tuy nhiên khi tôi in ra chuỗi nó cho thấy là '\\ U00B5 g/dL'. *, Có thì bạn in chuỗi? –

+0

Cảm ơn Richard, tôi in nó trong R console. – outboundbird

+1

Dường như với tôi rằng vấn đề là ít hơn về việc in các ký tự unicode chính xác hơn là về việc đọc chính xác văn bản unicode chữ từ một tập tin và có nó được hiểu là một chuỗi unicode. –

Trả lời

27

Trước tiên, hãy hiểu rằng ký tự nhất định trong R phải được thoát nếu chúng nằm ngoài các ký tự ASCII chuẩn. Thông thường, điều này được thực hiện với ký tự "\". Đó là lý do tại sao bạn cần phải thoát khỏi ký tự này khi bạn viết một chuỗi trong R

a <- "\" # error 
a <- "\\" # ok. 

"\ U" là một chỉ báo đặc biệt cho thoát Unicode. Lưu ý rằng không có dấu gạch chéo hoặc U trong chuỗi khi bạn sử dụng thoát này. Nó chỉ là một phím tắt cho một nhân vật cụ thể. Lưu ý:

a <- "\U00B5" 
cat(a) 
# µ 
grep("U",a) 
# integer(0) 
nchar(a) 
# [1] 1 

này rất khác so với chuỗi

a <- "\\U00B5" 
cat(a) 
# \U00B5 
grep("U",a) 
# [1] 1 
nchar(a) 
# [1] 6 

Thông thường khi bạn nhập tập tin văn bản, bạn sẽ mã hóa ký tự phi ASCII trong bất cứ mã hóa được sử dụng bởi các tập tin (UTF-8, hoặc Latin-1 là phổ biến nhất). Chúng có các byte đặc biệt để biểu diễn các ký tự này. Nó không phải là "bình thường" cho một tập tin văn bản để có một chuỗi thoát ASCII cho các ký tự unicode. Đây là lý do tại sao R không cố gắng chuyển đổi "\ U00B5" thành ký tự unicode vì nó giả định rằng nếu bạn muốn có một ký tự unicode, bạn sẽ chỉ sử dụng nó trực tiếp.

Cách dễ nhất để liên kết lại giá trị ký tự ASCII của bạn là sử dụng gói stringi. Đối với exampel

library(stringi) 
a <- "\\U00B5" 
stri_unescape_unicode(gsub("\\U","\\u",a, fixed=TRUE)) 

(bắt duy nhất là chúng tôi cần chuyển "\ U" sang "\ u" phổ biến hơn để chức năng nhận dạng đúng cách thoát). Bạn có thể làm điều này với dữ liệu đã nhập với

test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE)) 
Các vấn đề liên quan