2017-12-10 23 views
3

1つのデータフレームに特殊文字が含まれていて、他のデータフレームに含まれていないテーブルに一致する問題が発生します。例:ここではñドニャアナ郡対アナ郡R: "特殊"文字をUTF-8に変換しますか?

は、あなたが出力を再現できるスクリプトですか:

library(tidyverse) 
library(acs) 
tbl_df(acs::fips.place) # contains "Do\xf1a Ana County" 
tbl_df(tigris::fips_codes) # contains "Dona Ana County" 

例:

tbl_df(tigris::fips_codes) %>% filter(county == "Dona Ana County") 

リターン:

# A tibble: 1 x 5 
    state state_code state_name county_code   county 
    <chr>  <chr>  <chr>  <chr>   <chr> 
1 NM   35 New Mexico   013 Dona Ana County 

は残念ながら、次のクエリは何も返さない:R Studioでのデータフレームを開くときに

tbl_df(acs::fips.place) %>% filter(COUNTY == "Do\xf1a Ana County") 
tbl_df(acs::fips.place) %>% filter(COUNTY == "Doña Ana County") 
tbl_df(acs::fips.place) %>% filter(COUNTY == "Dona Ana County") 

# A tibble: 0 x 7 
# ... with 7 variables: STATE <chr>, STATEFP <int>, PLACEFP <int>, PLACENAME <chr>, TYPE <chr>, FUNCSTAT <chr>, COUNTY <chr> 

はしかし、それは示しています

Special characters

は質問1:なぜ2番目のクエリは、ノーリターンが得られていないん、 "Do \ xf1a Ana County"はデータベースに表示されますか?

質問2:どのように私はN、または同様に、このようなñなど、すべての "特別な" 文字を変換することができます(UTF-8?)?すべての文字のルールを定義するのではなく、ヘッダまたは定義のライブラリまたはスニペットがありますか?私は両方のテーブルの特定の列を一致させるために、これをとにかく実行しなければなりません。

ありがとうございました!

+0

問題は 'acs :: fips.place'がひどく混乱していることです。 '\\ xf1a'は何も意味しません。 '\ xf1a'は' latin1'エンコーディングでは行いますが、一方から他方への変換は難しいです。もし私があなただったら、私は 'acs'パッケージのマンテイナにバグを報告するでしょう。 – Ista

答えて

2

使用

あなたが本当に持っていることは、あなたは、例えば使用してRコンソールでこれを確認することができます Do\\xf1aあるデータセットで
tbl_df(acs::fips.place) %>% filter(COUNTY == "Do\\xf1a Ana County") 

acs::fips.place[grep("Ana",f$COUNTY),] 

機能を使用することですiconv(x, from = "", to = "")または enc2utf8またはenc2nativeには "from"引数はありません。 ほとんどの場合、パッケージをビルドするには、データをUTF-8に変換する必要があります(パッケージをビルドするときに私のフランス語の文字列をすべてトランスコードする必要があります)。ここではlatin1だと思いますが、\はエスケープされています。

最後に、あなたが(まっすぐ自分のエンコーディング地獄から)この機能を使用することができ、同等の文字列を取得するには、あなたの出力をクリーンアップする必要がある場合
x<-"Do\\xf1a Ana County" 
Encoding(x)<-"latin1" 
charToRaw(x) 
# [1] 44 6f f1 61 20 41 6e 61 20 43 6f 75 6e 74 79 
xx<-iconv(x, "latin1", "UTF-8") 
charToRaw(xx) 
# [1] 44 6f c3 b1 61 20 41 6e 61 20 43 6f 75 6e 74 79 

to.plain <- function(s) { 
    #old1 <- iconv("èéêëù","UTF8") #use this if your console is in LATIN1 
    #new1 <- iconv("eeeeu","UTF8") #use this if your console is in LATIN1 
    old1 <- "èéêëù" 
    new1 <- "eeeeu" 
    s1 <- chartr(old1, new1, s)  
} 
+0

私はそれが良い方法がないことを学ぶと解決したとマークします。私はこの問題を解決するためには多くの手順が必要だと少し驚いています。 – Christopher

+0

ありがとうございます、それはあなたの賢明です、ありがとうございます。 – Cedric

+0

エンコーディング[rstudio](https://support.rstudio.com/hc/en-us/articles/200532197-Character-Encoding)、 [encoding hell](http://people.fas.harvard。 edu /〜izahn/posts/read-data-with-non-native-encoding-in-r /)、 [R 2.1.0のエンコーディング](https://developer.r-project.org/Encodings_and_R.html) ) – Cedric

2

第一の問題は、acs::fips.placeがひどくマングルであることです。たとえば\\xf1aの場合は\xf1aを意味します。パッケージマンテイナーにバグを報告する必要があります。エスケープがクリーンアップされていたら

tbl_df(acs::fips.place) %>% 
    mutate(COUNTY = scan(text = str_c(COUNTY, collapse = "\n"), 
         sep = "\n", 
         what = "character", 
         allowEscapes = TRUE)) -> fp 

Encoding(fp$COUNTY) <- "latin1" 

fp %>% 
    filter(COUNTY == "Doña Ana County") 

あなたはアスキーの置換に非ASCII文字を翻字することができます。一方で、ここでは1つのワークアラウンドです。stringiパッケージは簡単です:

library(stringi) 
fp$COUNTY <- stri_trans_general(fp$COUNTY, "latin-ascii") 

fp %>% 
    filter(COUNTY == "Dona Ana County") 
+0

これは "Doを Ana Countyに"作成しますか? – Christopher

+0

それはおそらく別のバグです(Rそのもの)。それを無視することができます(印刷された表現にのみ影響します)。または 'iconv'ステップをスキップします。 (私は、 'iconv'ステップをオプションとラベル付けしました。) – Ista

+0

これで' iconv'パーツが削除され、2番目の質問への回答が追加されました。 – Ista

関連する問題