2015-04-30 9 views
7

Sto usando R 3.2.0 con RStudio 0.98.1103 su Windows 7 64-bit. Windows "impostazioni regionali e della lingua" del mio computer è inglese (Stati Uniti).utf-8 caratteri si perdono durante la conversione da elenco a data.frame in R

Per qualche motivo il seguente codice sostituisce i miei caratteri cechi "č" e "ř" con "c" e "r" nel testo "Koryčany nad přehradou", quando ho letto un file XML nella codifica utf-8 da il Web, analizza il file XML in un elenco e converte l'elenco in un data.frame.

library(XML) 
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken=" 
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE)) 
infoList <- xmlToList(doc[[2]][[1]]) 
siteName <- infoList$siteName 

#this still displays correctly "Koryčany nad přehradou" 
print(siteName) 

#make a data.frame from the list item. I suspect here is the problem. 
df <- data.frame(name=siteName, id=1) 

#now the Czech characters are lost. I see only "Korycany nad prehradou" 
View(df) 

write.csv(df,"test.csv") 
#the test.csv file also contains "Korycany nad prehradou" 
#instead of "Koryčany nad přehradou" 

Qual è il problema? Come faccio a far visualizzare a R il mio data.frame correttamente con tutti i caratteri speciali di utf-8 e salvare il file .csv senza perdere i caratteri "č" e "ř" ceco?

+1

È possibile modificare le impostazioni internazionali in CZ e risolverlo in questo modo? – thelatemail

+0

una soluzione parziale per me era: 'Sys.setLocale (locale =" Czech ")' per visualizzare correttamente data.frame come 'Koryčany nad přehradou' in R. Ma ora quando uso' write.csv (df, "test .csv ")' e apri test.csv in Excel o nel Blocco note, il testo appare come: 'Koryèany nad pøehradou' nel file csv. L'unico modo per risolvere il problema era aprire il file csv in Notepad ++ e cambiare la codifica del file in Windows-1250. – jirikadlec2

+0

Non sono convinto che si tratti di un duplicato esatto. L'altra domanda sembra concentrarsi su un problema di visualizzazione, in cui sembra che questo stia effettivamente cambiando l'archiviazione dei dati: il duplicato precedente: http://stackoverflow.com/questions/17715956/why-do-some-unicode-characters -display-in-matrici-ma-non-data-frames-in-r? lq = 1 – thelatemail

risposta

4

Questa non è una risposta perfetta, ma la seguente soluzione ha risolto il problema per me. Ho cercato di capire il comportamento o R, e fare l'esempio in modo che il mio script R produce gli stessi risultati sia su Windows e su piattaforma Linux:

(1) Ottenere dati XML in UTF-8 da Internet

library(XML) 
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken=" 
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE)) 
infoList <- xmlToList(doc[[2]][[1]]) 
siteName <- infoList$siteName 

(2) Stampare il testo da Internet: la codifica è UTF-8, visualizzazione nella console R è anche corretto utilizzando sia il ceco e il locale inglese su Windows:

> Sys.getlocale(category="LC_CTYPE") 
[1] "English_United States.1252" 
> print(siteName) 
[1] "Koryčany nad přehradou" 
> Encoding(siteName) 
[1] "UTF-8" 
> 

(3) Prova a creare e visualizzare un data.frame. Questo ha un problema. I display data.frame correttamente sia nella vista RStudio e nella console:

df <- data.frame(name=siteName, id=1) 
df 
        name id 
1 Korycany nad prehradou 1 

(4) Prova di utilizzare una matrice invece. Sorprendentemente la matrice viene visualizzata correttamente nella console R.

m <- as.matrix(df) 
View(m) #this shows incorrectly in RStudio 
m  #however, this shows correctly in the R console. 
    name      id 
[1,] "Koryčany nad přehradou" "1" 

(5) Modificare le impostazioni locali. Se sono su Windows, imposta la locale in ceco. Se sono su Unix o Mac, imposta la locale su UTF-8. NOTA: questo ha alcuni problemi quando eseguo lo script in RStudio, apparentemente RStudio non reagisce sempre immediatamente al comando Sys.setlocale.

#remember the original locale. 
original.locale <- Sys.getlocale(category="LC_CTYPE") 

#for Windows set locale to Czech. Otherwise set locale to UTF-8 
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8") 
Sys.setlocale("LC_CTYPE", new.locale) 

(7) Scrivere i dati in un file di testo. IMPORTANTE: non utilizzare write.csv ma utilizzare write.table. Quando il mio locale è Czech sul mio Windows inglese, devo usare lo fileEncoding="UTF-8" nel write.table. Ora il file di testo appare correttamente in notepad ++ e anche in Excel.

write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8") 

(8) Impostare l'impostazione internazionale indietro originale

Sys.setlocale("LC_CTYPE", original.locale) 

(9) Provate a leggere il file di testo di nuovo in R. NOTA: Se leggo il file, ho dovuto impostare il encoding parametro (NON fileEncoding!). La visualizzazione di un data.frame lettura dal file non è ancora corretta, ma quando si converte il mio data.frame ad un matrix l'UTF-8 Repubblica caratteri sono conservati:

data.from.file <- read.table("test-czech-utf8.txt", sep="\t", encoding="UTF-8") 
#the data.frame still has the display problem, "č" and "ř" get "lost" 
> data.from.file 
        name id 
1 Korycany nad prehradou 1 

#see if a matrix displays correctly: YES it does! 
matrix.from.file <- as.matrix(data.from.file) 
> matrix.from.file 
    name      id 
1 "Koryčany nad přehradou" "1" 

Quindi la lezione imparata è che ho bisogno di convertire il mio data.frame su un matrix, imposta il mio locale su Czech (su Windows) o su UTF-8 (su Mac e Linux) prima di scrivere i miei dati con caratteri cechi su un file.Quindi quando scrivo il file, devo assicurarmi che fileEncoding debba essere impostato su UTF-8. D'altra parte, quando in seguito leggerò il file, posso continuare a lavorare nelle impostazioni locali in inglese, ma in read.table devo impostare lo encoding="UTF-8".

Se qualcuno ha una soluzione migliore, accolgo con favore i vostri suggerimenti.

Problemi correlati