【问题标题】:R: Replace Special CharactersR:替换特殊字符
【发布时间】:2017-06-09 03:00:59
【问题描述】:

我有一个带有特殊字符的数据框,如下所示

Key  Q1   Q2
22   aSk   aÃ…Â k
23   aSk   aÃ…Â k
24   aSk   aÃ…Â k

我想将 Q2 中的“Ã…Â k”(包括 k 之间的空格)替换为“aSk”,结果如下(与 Q1 相同)

Key  Q1   Q2 
22   aSk   aSk
23   aSk   aSk
24   aSk   aSk

我曾尝试在 R 中使用 gsub 函数

df$Q2 <- gsub("[Ã…Â]", "S", df$Q2) 

但我无法删除“空格”并获得如下结果

Key  Q1   Q2 
22   aSk   aSSS k
23   aSk   aSSS k
24   aSk   aSSS k

我可以知道我的代码有什么问题以及如何删除 R 中的“空格”和“SSS”吗?

(我在 csv 中的原始文件中的实际单词是“aÅ k”。但是,它在 R 中显示为“aÃ…Â k”)

谢谢。

【问题讨论】:

    标签: r string replace special-characters gsub


    【解决方案1】:

    我们可以匹配一个或多个不是alpbabets的字符,并将其替换为"S"

    df$Q2 <- sub("[^A-Za-z]+", "S", df$Q2)
    df$Q2
    #[1] "aSk" "aSk" "aSk"
    

    或者我们从字符串的开头 (*) 仅捕获字母字符作为一个组 (([A-Za-z]*),匹配以下非字母字符并替换为捕获组的反向引用,后跟"S"

    sub("^([A-Za-z]*)[^A-Za-z]+", "\\1S", df$Q2)
    #[1] "aSk" "aSk" "aSk"
    

    【讨论】:

    • 是否依赖于语言环境? IE。 - ÃÂ 在它们是标准语言字符的某些语言环境中会介于 A-Z 之间吗?
    • @thelatemail 我不确定。使用 R 3.4.0
    • @thelatemail 如果您替换为 [[:alpha:]] ,它最终解决了您的问题吗?如果我们使用[A-z],它将包括其他字符,但不包括[A-Za-z]。无论如何,你得到不同的输出有点奇怪
    • 我没有得到不同的输出,但我是一个无聊的澳大利亚人。我只是好奇这是否会根据语言环境而改变。例如。 - 法语、西班牙语、芬兰语或 .... 的此类问题可能会改变 A-Z 包含的字符 - *.com/questions/12889760/…
    • @thelatemail 可能是。我的语言环境设置是locale: [1] LC_COLLATE=English_United States.1252 [2] LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United States.1252