Rで文字ベクトルの一貫性のないエンコードに問題があります。
テーブルを読み込んだテキストファイルは、(_Notepad++
_を介して)_UTF-8
_でエンコードされています(_UTF-8 without BOM
_も試しました)。
このテキストファイルからテーブルを読み取り、それを_data.table
_に変換し、key
を設定して、バイナリ検索を利用したいと思います。私がそうしようとしたとき、次のようになりました:
警告メッセージ:_
[.data.table
_(poli.dt、 "żżonymi"、mult = "first")で:既知のエンコード(latin1またはUTF-8)が結合列で検出されました。 data.tableは現在バイトを比較しているため、mixedエンコードをサポートしていません。つまり、latin1とUTF-8の両方を使用している場合、または不明なエンコードが非ASCIIであり、それらの一部が既知とマークされていて、他はそうでない場合です。しかし、latin1またはUTF-8のいずれかが排他的に使用され、未知のエンコーディングがすべてASCIIである場合、結果は問題ないはずです。将来的にはチェックして、すべてが問題なければこの警告を回避します。難しい部分は、ASCIIのみの場合のパフォーマンスに影響を与えずにこれを行うことです。
およびバイナリ検索動作しません。
_data.table
_-key
列は、「不明」と「UTF-8」エンコーディングタイプの両方で構成されていることに気付きました。
_> table(Encoding(poli.dt$Word))
unknown UTF-8
2061312 2739122
_
私はこの列を(_data.table
_オブジェクトを作成する前に)変換しようとしました:
Encoding(Word) <- "UTF-8"
Word<- enc2utf8(Word)
しかし、効果はありません。
また、ファイルをRに読み込むいくつかの異なる方法を試しました(すべての有用なパラメーターを設定します(例:_encoding = "UTF-8"
_)):
data.table::fread
_utils::read.table
_base::scan
_colbycol::cbc.read.table
_しかし、効果はありません。
私のR.version:
_> R.version
_
platform x86_64-w64-mingw32
Arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 0.3
year 2014
month 03
day 06
svn rev 65126
language R
version.string R version 3.0.3 (2014-03-06)
nickname Warm Puppy
_
私のセッション情報:
_> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Polish_Poland.1250 LC_CTYPE=Polish_Poland.1250 LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C LC_TIME=Polish_Poland.1250
base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.2 colbycol_0.8 filehash_2.2-2 rJava_0.9-6
loaded via a namespace (and not attached):
[1] plyr_1.8.1 Rcpp_0.11.1 reshape2_1.2.2 stringr_0.6.2 tools_3.0.3
_
Encoding
関数は、文字列に「ネイティブエンコーディング」マーク(場合によってはCP-1250)がある場合、またはASCIIである場合、unknown
を返します。これら2つのケースを区別するには、以下を呼び出します。
library(stringi)
stri_enc_mark(poli.dt$Word)
各文字列が有効なUTF-8バイトシーケンスであるかどうかを確認するには、次を呼び出します。
all(stri_enc_isutf8(poli.dt$Word))
そうでない場合、ファイルは間違いなくUTF-8ではありません。
データ読み取り関数でUTF-8モードを強制していないと思われます(poli.dt$Word
の内容を調べて、このステートメントを確認してください)。私の推測が正しい場合、試してください:
read.csv2(file("filename", encoding="UTF-8"))
または
poli.dt$Word <- stri_encode(poli.dt$Word, "", "UTF-8") # re-mark encodings
data.table
がまだ「混合」エンコーディングについて文句を言っている場合、非ASCII文字を音訳することをお勧めします。例:
stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII")
## [1] "Zazolc gesla jazn"
私自身も同様の問題の解決策を見つけることができませんでした。 txtファイルの未知のエンコーディング文字をRで管理しやすいものに変換できませんでした。
したがって、同じデータセットで同じ文字が複数回表示される状況にありました。これは、異なる文字コード(ラテン語設定では「X」、ギリシャ語設定では「X」)であるためです。ただし、txtの保存操作では、そのエンコードの違いが保持されました。もちろん、よくできています。
上記の方法のいくつかを試しても、何も機能しませんでした。この問題はよく説明されています 「ASCII UTF-8と区別できず、設定してもビットが固執しません」 。
適切な回避策は "data.frameをCSV一時ファイルにエクスポートし、data.table :: fread()で再インポートし、ソースエンコーディングとしてLatin-1を指定します。" です。
上記のソースから与えられた例を再現/コピー:
package(data.table)
df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields
fwrite(df,"temp.csv")
your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")
私はそれが誰かを助けることを願っています。