web-dev-qa-db-ja.com

Rで非UTF-8文字を識別/削除する方法

Stataデータセットを[〜#〜] r [〜#〜]にインポートすると(foreignパッケージを使用して)、インポートに無効な文字が含まれることがありますUTF-8。これだけでは十分ではありませんが、オブジェクトをJSONに変換しようとするとすぐにすべてが壊れます(rjsonパッケージを使用)。

無効なものを識別する方法-UTF-8文字列内の文字とその後削除しますか?

23
Marcel Hebing

iconvとその引数sub:文字列を使用する別のソリューション。 NA(ここでは ''に設定)でない場合、入力内の変換不可能なバイトを置き換えるために使用されます。

x <- "fa\xE7ile"
Encoding(x) <- "UTF-8"
iconv(x, "UTF-8", "UTF-8",sub='') ## replace any non UTF-8 by ''
"faile"

ここで、適切なエンコーディングを選択した場合、

x <- "fa\xE7ile"
Encoding(x) <- "latin1"
xx <- iconv(x, "latin1", "UTF-8",sub='')
facile
23
agstudy

データセット全体でdplyrを使用して不良文字を削除する別のアプローチ:

library(dplyr)

MyDate %>%
    mutate_at(vars(MyTextVar1, MyTextVar2), function(x){gsub('[^ -~]', '', x)})

ここで、MyDataMyTextVarは、不良リンゴを削除するデータセットとテキスト変数です。これは、エンコーディングを変更するよりも堅牢ではないかもしれませんが、多くの場合、それらを削除するだけで十分で簡単です。

1
Tyler Rinker

それらを削除する代わりに、iconvを使用してそれらをUTF-8文字列に変換してみることができます。

require(foreign)
dat <- read.dta("data.dta")

for (j in seq_len(ncol(dat))) {
   if (class(dat[, j]) == "factor")
       levels(dat[, j]) <- iconv(levels(dat[, j]), from = "latin1", to = "UTF-8")
}

latin1を、より適切なencondingに置き換えることができます。私たちはあなたのデータにアクセスできないので、どちらがより適しているかを知ることは困難です。

1
dickoa

Yihuiのxfunパッケージには、ファイルを読み取ろうとする_read_utf8_関数があり、それがUTF-8としてエンコードされていると想定しています。ファイルに非UTF-8行が含まれている場合、警告がトリガーされ、どの行に非UTF-8文字が含まれているかが通知されます。内部では、エクスポートされていない関数xfun:::invalid_utf8()を使用します。これは、単にwhich(!is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8")))です。

文字列内のdetect特定の非UTF-8単語にするには、上記を少し変更して、次のようなことを行います。

_invalid_utf8_ <- function(x){

  !is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8"))

}

detect_invalid_utf8 <- function(string, seperator){

  stringSplit <- unlist(strsplit(string, seperator))

  invalidIndex <- unlist(lapply(stringSplit, invalid_utf8_))

  data.frame(
    Word = stringSplit[invalidIndex],
    stringIndex = which(invalidIndex == TRUE)
  )

}

x <- "This is a string fa\xE7ile blah blah blah fa\xE7ade"

detect_invalid_utf8(x, " ")

#     Word stringIndex
# 1 façile    5
# 2 façade    9
_
0
conrad-mac