R:替换字符串中的外来字符

kri*_*nan 10 r string-matching

我正在处理大量数据,主要是非英文字符的名称.我的目标是将这些名称与在美国收集的一些信息相匹配.

也就是说,我可能希望将名称'Sølvsten'(从某些名称列表)与'Soelvsten'(存储在某些美国数据库中的名称)相匹配.这是我写的一个函数来做这件事.它显然很笨拙,有点随意,但我想知道是否有一个简单的R函数将这些外来字符转换为最近的英国邻居.我知道可能没有任何标准的方法来进行这种转换,但我只是好奇是否有转换可以通过R函数完成.

# a function to replace foreign characters
replaceforeignchars <- function(x)
{
    require(gsubfn);
    x <- gsub("š","s",x)
    x <- gsub("œ","oe",x)
    x <- gsub("ž","z",x)
    x <- gsub("ß","ss",x)
    x <- gsub("þ","y",x)
    x <- gsub("à","a",x)
    x <- gsub("á","a",x)
    x <- gsub("â","a",x)
    x <- gsub("ã","a",x)
    x <- gsub("ä","a",x)
    x <- gsub("å","a",x)
    x <- gsub("æ","ae",x)
    x <- gsub("ç","c",x)
    x <- gsub("è","e",x)
    x <- gsub("é","e",x)
    x <- gsub("ê","e",x)
    x <- gsub("ë","e",x)
    x <- gsub("ì","i",x)
    x <- gsub("í","i",x)
    x <- gsub("î","i",x)
    x <- gsub("ï","i",x)
    x <- gsub("ð","d",x)
    x <- gsub("ñ","n",x)
    x <- gsub("ò","o",x)
    x <- gsub("ó","o",x)
    x <- gsub("ô","o",x)
    x <- gsub("õ","o",x)
    x <- gsub("ö","o",x)
    x <- gsub("ø","oe",x)
    x <- gsub("ù","u",x)
    x <- gsub("ú","u",x)
    x <- gsub("û","u",x)
    x <- gsub("ü","u",x)
    x <- gsub("ý","y",x)
    x <- gsub("ÿ","y",x)
    x <- gsub("?","g",x)

    return(x)
}
Run Code Online (Sandbox Code Playgroud)

注意:我知道存在名称匹配算法,例如Jaro Winkler Distance Matching,但我宁愿进行完全匹配.

G. *_*eck 17

尝试使用chartrR函数进行一个字符替换(这应该非常快),然后通过一系列gsub调用来清理它,每个一对二字符替换(可能会更慢但是没有很多)他们).

to.plain <- function(s) {

   # 1 character substitutions
   old1 <- "šžþàáâãäåçèéêëìíîïðñòóôõöùúûüý"
   new1 <- "szyaaaaaaceeeeiiiidnooooouuuuy"
   s1 <- chartr(old1, new1, s)

   # 2 character substitutions
   old2 <- c("œ", "ß", "æ", "ø")
   new2 <- c("oe", "ss", "ae", "oe")
   s2 <- s1
   for(i in seq_along(old2)) s2 <- gsub(old2[i], new2[i], s2, fixed = TRUE)

   s2
}
Run Code Online (Sandbox Code Playgroud)

添加到old1,new1,old2和new2需要.

这是一个测试:

> s <- "æxš"
> to.plain(s)
[1] "aexs"
Run Code Online (Sandbox Code Playgroud)

更新:更正的变量名称chartr.


the*_*ail 9

编辑可能更好的结果......

这可能不适用于所有情况,但iconv可能值得研究.来自?iconv:

描述:

 This uses system facilities to convert a character vector between
 encodings: the ‘i’ stands for ‘internationalization’.
Run Code Online (Sandbox Code Playgroud)

例:

test <- c("Sølvsten", "Günther")
iconv(test, "latin1", "ASCII//TRANSLIT")
#[1] "Solvsten" "Gunther" 
Run Code Online (Sandbox Code Playgroud)

这并没有大大简化,但我认为有一些东西可以说是将数据与代码分开.这与此问题非常相似:

R:用gsub替换字符,如何创建函数?

定义from和to:

fromto <- read.table(text="
from to
š s
œ oe
ž z
ß ss
þ y
à a
á a
â a
ã a
ä a
å a
æ ae
ç c
è e
é e
ê e
ë e
ì i
í i
î i
ï i
ð d
ñ n
ò o
ó o
ô o
õ o
ö o
ø oe
ù u
ú u
û u
ü u
ý y
ÿ y
? g",header=TRUE)
Run Code Online (Sandbox Code Playgroud)

然后功能:

replaceforeignchars <- function(dat,fromto) {
  for(i in 1:nrow(fromto) ) {
    dat <- gsub(fromto$from[i],fromto$to[i],dat)
  }
  dat
}

test <- c("Sølvsten", "Günther")
replaceforeignchars(test,fromto)
#[1] "Soelvsten" "Gunther"
Run Code Online (Sandbox Code Playgroud)


dic*_*koa 8

您可以安装uni2asciiC程序并从R调用它.

uni2ascii <- function(string) {
    cmd <- sprintf("echo %s | uni2ascii -B", string)
    system(cmd, intern = TRUE, ignore.stderr = TRUE)
}

uni2ascii <- Vectorize(uni2ascii, USE.NAMES = FALSE)

uni2ascii(c("Sølvsten", "?", "œ"))
## [1] "Solvsten" "g"        "oe"
Run Code Online (Sandbox Code Playgroud)