R:将 "special" 个字母转换为 UTF-8?
R: Converting "special" letters into UTF-8?
我 运行 遇到匹配表的问题,其中一个数据帧包含特殊字符而另一个不包含特殊字符。示例:Doña Ana County vs. Dona Ana County
这是一个可以重现输出的脚本:
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")
returns:
# 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
不幸的是,以下查询return没有:
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>
然而,当在 R Studio 中打开数据框时,它显示:
问题一:为什么数据库中出现了"Do\xf1a Ana County",但是第二个查询却没有return?
问题2:如何将所有"special"字符如ñ转换成n,或类似的(UTF-8?)?是否有相应的库或片段,或 header 中的定义,而不是为每个字符定义规则?无论如何我都必须这样做才能匹配两个表中的某些列。
谢谢!
使用
tbl_df(acs::fips.place) %>% filter(COUNTY == "Do\xf1a Ana County")
在你的数据集中,你真正拥有的是 Do\xf1a
你可以在 R 控制台中检查它,例如:
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)
}
第一个问题是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 字符音译为 ascii 替换字符。 stringi
包使它变得简单:
library(stringi)
fp$COUNTY <- stri_trans_general(fp$COUNTY, "latin-ascii")
fp %>%
filter(COUNTY == "Dona Ana County")
我 运行 遇到匹配表的问题,其中一个数据帧包含特殊字符而另一个不包含特殊字符。示例:Doña Ana County vs. Dona Ana County
这是一个可以重现输出的脚本:
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")
returns:
# 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
不幸的是,以下查询return没有:
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>
然而,当在 R Studio 中打开数据框时,它显示:
问题一:为什么数据库中出现了"Do\xf1a Ana County",但是第二个查询却没有return?
问题2:如何将所有"special"字符如ñ转换成n,或类似的(UTF-8?)?是否有相应的库或片段,或 header 中的定义,而不是为每个字符定义规则?无论如何我都必须这样做才能匹配两个表中的某些列。
谢谢!
使用
tbl_df(acs::fips.place) %>% filter(COUNTY == "Do\xf1a Ana County")
在你的数据集中,你真正拥有的是 Do\xf1a
你可以在 R 控制台中检查它,例如:
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)
}
第一个问题是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 字符音译为 ascii 替换字符。 stringi
包使它变得简单:
library(stringi)
fp$COUNTY <- stri_trans_general(fp$COUNTY, "latin-ascii")
fp %>%
filter(COUNTY == "Dona Ana County")