Gsub 到 gsubfn,它是如何传递的?

Gsub to gsubfn, how does it transfer?

我正在清理我的数据集并删除字母等的所有重音。为了做到这一点,我使用 gsub(见下面的代码)。它工作得很好,但我相信有更方便的方法来做到这一点。我听说过 gsubfn 但我一直无法弄清楚它是如何工作的。关于此或任何其他提高此代码效率的方法的提示?

Ech_final$lastname.y <- gsub(' ', "", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("'", "", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("/", "", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("Ë", "E", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("É", "E", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("È", "E", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("Ç", "C", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("À", "A", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("Ù", "U", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("Œ", "OE", Ech_final$lastname.y)
Ech_final$lastname.y <- gsub("Ï", "I", Ech_final$lastname.y)

谢谢!

这里有几种选择。第一个根据问题的主题行的要求使用 gsubfn。接下来的两个使用 iconvchartr 用于替换为一个字符的替换,而 gsub 用于剩余的替换。最后两个使用 gsub 用于所有使用 Reduce 或循环的替换。

1) gsubfn gsubfn 像这样使用,其中第一个参数表示匹配每个字符,第二个是翻译列表,第三个是输入。

library(gsubfn)

x <- " '/ËÉÈÇÀÙŒÏ"   # input

L <- list(" " = "", "'" = "", "/" = "", Ë = "E", É = "E", È = "E", 
    Ç = "C", À = "A", Ù = "U", Œ = "OE", Ï = "I")

gsubfn(".", L,  x)
## [1] "EEECAUOEI"

2) gsub/iconv 另一种方法是将 gsubiconv 混合使用(对于替换不是一个字符的情况)。输入x定义如上

Encoding(x)  # note the encoding
## [1] "latin1"

x |>
  gsub(pattern = "Œ", replacement = "OE") |>
  gsub(pattern = "[ '/]", replacement = "") |>
  iconv("latin1", "ascii//translit")
## [1] "EEECAUOEI"

3) gsub/chartr 第三种选择与 (2) 相同,只是我们使用 chartr 代替 iconv。输入x定义如上

x |>
  gsub(pattern = "Œ", replacement = "OE") |>
  gsub(pattern = "[ '/]", replacement = "") |>
  chartr(old = "ËÉÈÇÀÙÏ", new = "EEECAUI")
## [1] "EEECAUOEI"

4) gsub/Reduce 此替代方案执行问题中显示的 gsub 调用,但使用 Reduce 以更紧凑的形式执行.列表 L 和输入 x 来自 (1).

Reduce(function(s, nm) gsub(nm, L[[nm]], s), names(L), x)
## [1] "EEECAUOEI"

5) gsub/for 可以使用一个简单的 for 循环来 运行 问题中的 gsub 调用。列表 L 和输入 x 来自 (1).

xx <- x
for(nm in names(L)) xx <- gsub(nm, L[[nm]], xx)
xx
## [1] "EEECAUOEI"