【问题标题】:Replace non-ascii chars with a defined string list without a loop in R用 R 中没有循环的已定义字符串列表替换非 ascii 字符
【发布时间】:2012-05-29 02:22:59
【问题描述】:

我想用对应的 ascii 替换非 ascii 字符(目前只有西班牙语)。如果我有“á”,我想用“a”替换它,依此类推。

我构建了这个函数(工作正常),但我不想使用循环(包括像 sapply 这样的内部循环)。

latin2ascii<-function(x) {
if(!is.character(x)) stop ("input must be a character object")
require(stringr)
mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü")
mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U")
for(y in 1:length(mapL)) {
  x<-str_replace_all(x,mapL[y],mapA[y])
  }
x
}

有没有优雅的方法来解决它?任何帮助、建议或修改表示赞赏

【问题讨论】:

    标签: r replace special-characters non-ascii-characters


    【解决方案1】:

    gsubfn() 同名包里的这种东西真的很不错:

    library(gsubfn)
    
    # Create a named list, in which:
    #   - the names are the strings to be looked up
    #   - the values are the replacement strings
    mapL <- c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü")
    mapA <- c("a","e","i","o","u","A","E","I","O","U","n","N","u","U")
    
    # ll <- setNames(as.list(mapA), mapL) # An alternative to the 2 lines below
    ll <- as.list(mapA)
    names(ll) <- mapL
    
    
    # Try it out
    string <- "ÍÓáÚ"
    gsubfn("[áéíóúÁÉÍÓÚñÑüÜ]", ll, string)
    # [1] "IOaU"
    

    编辑:

    G. Grothendieck 指出,base R 也有这样的功能:

    A <- paste(mapA, collapse="")
    L <- paste(mapL, collapse="")
    chartr(L, A, "ÍÓáÚ")
    # [1] "IOaU"
    

    【讨论】:

    • 谢谢!完美运行。只有一个问题(只是想知道);你知道 gsubfn 函数是否使用任何类型的内部循环吗?应该比 sapply 快吗?
    • @Álvaro -- 我不认为gsubfn() 特别快 -- '只是' 方便和优雅。
    • 另见 chartr 在 R 的基础上,这似乎可以解决上述问题,尽管如果实际问题存在变化,例如替换两个字符序列,那么 gsubfn 仍然可以处理它,但是不是chartr
    • @G.Grothendieck -- 感谢您指出这一点。我已将其附加到答案中。
    【解决方案2】:

    我喜欢 Josh 的版本,但我想我可能会添加另一个“矢量化”解决方案。它返回一个无重音字符串的向量。它也只依赖于base 函数。

    x=c('íÁuÚ','uíÚÁ')
    
    mapL<-c("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ","ü","Ü")
    mapA<-c("a","e","i","o","u","A","E","I","O","U","n","N","u","U")
    split=strsplit(x,split='')
    m=lapply(split,match,mapL)
    mapply(function(split,m) paste(ifelse(is.na(m),split,mapA[m]),collapse='') , split, m)
    # "iAuU" "uiUA"
    

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2015-02-27
      • 2013-09-08
      • 1970-01-01
      • 2013-01-29
      • 2015-08-14
      相关资源
      最近更新 更多