web-dev-qa-db-ja.com

RでUnicode文字列を出力します

.csvファイルにテキスト文字列を入力しました。これには、\U00B5 g/dLのようなUnicodeシンボルが含まれています。 .csvファイルとRデータフレームでの読み取り:

enter image description here

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

enter image description here

\U00B5は、マイクロ記号µを生成します。 Rはそれをそのままデータファイルに読み込みます(\U00B5)。ただし、文字列を印刷すると、\\U00B5 g/dLと表示されます。
また、手動でコードを入力しても問題ありません。

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

この場合、エスケープ記号\をどのように取り除き、シンボルを出力させることができますか。または、Rにシンボルを印刷する別の方法がある場合.

この助けてくれてありがとう!

23
outboundbird

さて、最初にRの特定の文字が標準ASCII文字の外にある場合はエスケープする必要があることを理解してください。通常、これは「\」文字を使用して行われます。これが、Rで文字列を記述するときにこの文字をエスケープする必要がある理由です。

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

「\ U」は、Unicodeエスケープの特別なインジケータです。このエスケープを使用するときは、文字列自体にスラッシュやUがないことに注意してください。これは、特定のキャラクターへの単なるショートカットです。注意:

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

これは文字列とは非常に異なります

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

通常、テキストファイルをインポートするときは、ファイルで使用されているエンコードで非ASCII文字をエンコードします(UTF-8またはLatin-1が最も一般的です)。これらの文字を表す特別なバイトがあります。テキストファイルがUnicode文字のASCIIエスケープシーケンスを持つことは「通常」ではありません。これが、Rが「\ U00B5」をUnicode文字に変換しようとしない理由です。ユニコード文字が必要な場合は、直接使用するだけでした。

ASCII文字値を再インターペットする最も簡単な方法は、stringiパッケージを使用することです。

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

(唯一の問題は、「\ U」をより一般的な「\ u」に変換する必要があったため、関数がエスケープを適切に認識したことです)。インポートしたデータに対してこれを行うことができます

test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE))
43
MrFlick