2012-07-06 20 views
7

Mam kilka nazwisk autorów z innych krajów w pliku CSV, który R w porządku. Próbuję je wyczyścić, aby przesłać je do Mechanical Turk (który naprawdę nie lubi nawet jednej umiędzynarodowionej postaci). Czyniąc to, mam pytanie (być wysłana później), ale nie mogę nawet dput je w rozsądny sposób:Jak poprawnie internować tekst w formacie dput?

> dput(df[306,"primauthfirstname"]) 
"Gwena\xeblle M" 
> test <- "Gwena\xeblle M" 
<simpleError in nchar(val): invalid multibyte string 1> 

Innymi słowy, dput działa dobrze, ale wklejanie wynik w nie . Dlaczego dput nie wyprowadza niezbędnych informacji, aby umożliwić ponowne kopiowanie/wklejanie do R (prawdopodobnie wszystko, co trzeba zrobić, to dodać atrybuty kodowania do instrukcji struktury?). Jak mam to zrobić?

Zauważ, że \xeb jest ważna postać w miarę R jest zaniepokojony:

> gsub("\xeb","", turk.df[306,"primauthfirstname"]) 
[1] "Gwenalle M" 

jednak, że nie można oceniać indywidualnie znaki - to kod szesnastkowy \ x ## albo nic:

> gsub("\\x","", turk.df[306,"primauthfirstname"]) 
[1] "Gwena\xeblle M" 
+3

To działa dobrze dla mnie: '(test <-" Gwena \ xeblle M ")' daje '[1]" Gwenaëlle M "'. Używam R 2.14.0 z 'LANG = en_US.UTF-8'. –

+0

@MichaelHoffman Co to jest 'LANG'? Jak mogę to sprawdzić? –

+0

To jest zmienna środowiskowa. Wypróbuj 'Sys.getenv (" LANG ")'. Jakiej wersji R używasz? –

Odpowiedz

1

dput() "pomoc" mówi: "Zapisuje tekstową reprezentację ASCII obiektu R". Więc jeśli twój obiekt zawiera znaki spoza ASCII, te nie mogą być reprezentowane i muszą być w jakiś sposób przekonwertowane.

Proponuję więc użyć iconv() do konwersji wektora przed dput ing. Jedno z podejść to:

> test <- "Gwena\xeblle M" 
> out <- iconv(test, from="latin1", to="ASCII", sub="byte") 
> out 
[1] "Gwena<eb>lle M" 
> gsub('<eb>', 'ë', out) 
[1] "Gwenaëlle M" 

które, jak widać, działa w obie strony. Możesz później użyć gsub(), aby przekonwertować bajty na znaki (jeśli kodowanie to obsługuje, np. Utf-8).

Drugie podejście jest prostsze (i myślę, że korzystne dla swoich potrzeb), ale działa w jedną stronę a libiconv nie mogą go wspierać:

> test <- "Gwena\xeblle M" 
> iconv(test, from="latin1", to="ASCII//TRANSLIT") 
[1] "Gwenaelle M" 

Nadzieja to pomaga!

Powiązane problemy