如何解决在 R 中识别 Unicode 替换字符U+FFFD 或 � 或黑色菱形问号
我有一个大型 Qualtrics 调查的数据,这些数据在我得到之前在 Stata 中进行了处理。我现在正在尝试清理 R 中的数据。一些葡萄牙语字符已被替换为 �。我正在尝试标记对一系列问题的文本输入响应,这些问题最初是“não”[英语中的“no”],现在被记录为“n�o”。我可以在下面的测试中看到 gsub() 和 grepl() 可以在列表或数据框中识别“�”,但是当我尝试对真实数据使用相同的命令时,这两个命令都无法识别“n” o”甚至“�”。没有错误;它只是无法替代 gsub() 并在 grepl() 应该为 TRUE 时标记为 FALSE。
是否有多种类型的 � 基于底层字符?有什么方法可以搜索或替换 � 字符以获取任何实例?
这个例子表明 gsub() 和 grepl() 在列表或数据框上都可以正常工作:
list <- c("n�o ç não","n�o","nao","não")
gsub("�","ã",list)
grepl("�",list)
library(dplyr)
df <- data.frame(list)
df.new <- df %>%
mutate(
sub = gsub("�",df$list),replace = grepl("�",list))
df.new$sub
df.new$replace
[1] "não ç não" "não" "nao" "não"
[1] 真真假假
[1] "não ç não" "não" "nao" "não"
[1] 真真假假
同样的代码无法在我的真实数据中识别“�”。
解决方法
我的猜测是您使用的是 Windows 机器,它有时不能很好地处理 unicode 字符。重新创建即时消息解析您的实际帖子以向您展示您可以做什么。我建议使用 stringi
库,并使用替换所有您知道是 ã
的字符作为捷径,但实际上您想用一揽子解决方案处理每种可能的情况.查看 ?stringi-search-charclass
以获取有关如何执行此操作的更多信息,但是...来自您的原始帖子:
我有一个大型 Qualtrics 调查的数据,这些数据在我得到之前在 Stata 中进行了处理。我现在正在尝试清理 R 中的数据。一些葡萄牙语字符已被替换为 �。我正在尝试标记对一系列问题的文本输入响应,这些问题最初是“não”[英语中的“no”],现在被记录为“n�o”。我可以在下面的测试中看到 gsub() 和 grepl() 可以在列表或数据框中识别“�”,但是当我尝试对真实数据使用相同的命令时,这两个命令都无法识别“n” o”甚至“�”。没有错误;它只是无法替代 gsub() 并在 grepl() 应该为 TRUE 时标记为 FALSE。
我们得到:
library(xml2)
library(stringi)
this_post = "https://stackoverflow.com/questions/66540384/identifying-unicode-replacement-characters-ufffd-or-or-black-diamond-questio#66540384"
read_html(this_post) %>%
xml_find_all('//*[@id="question"]/div/div[2]/div[1]/p[1]') %>%
xml_text() %>% stri_replace_all_regex("\\p{So}","ã")
我有一个大型 Qualtrics 调查的数据,这些数据在我得到之前在 Stata 中进行了处理。我现在正在尝试清理 R 中的数据。一些葡萄牙语字符已被替换为 ã。我试图标记对一系列问题的文本输入响应,这些问题最初是“não”[英语中的“no”],现在被记录为“não”。我可以在下面的测试中看到 gsub() 和 grepl() 可以在列表或数据框中识别“ã”,但是当我尝试对真实数据使用相同的命令时,这两个命令都无法识别“não”甚至“ã”。没有错误;它只是无法替代 gsub() 并在 grepl() 应该为 TRUE 时标记为 FALSE。
对于您的原始数据...看看这是否有效:
stringi::stri_escape_unicode(orig_data) %>%
stringi::stri_replace_all_regex("\\p{So}","ã")
还有一件事
你不能用未知字符 grepl
,因为函数不知道你要求它匹配什么,而是试试这个:
stringi::stri_unescape_unicode("\\u00e3")
[1] "ã"
grepl("\u00e3",stringi::stri_escape_unicode(orig_data),perl = TRUE)
[1] TRUE FALSE FALSE TRUE
根据评论进行编辑:
下面是一个很好的解决方案,因为您得到的“问号”字符可能由于是 ascii 而丢失。 注意,在我给出的示例中,您只需将 ANY/ALL 坏字符替换为“ã”。显然这不是一个好方法,但是如果您阅读了帮助文档,我相信您会看到如何将这种方法与转义混合使用来处理所有字符串。
orig_data$repaired_text <- stringi::stri_enc_toutf8(orig_data$text) %>% stringi::stri_replace_all_regex("\\p{So}","ã")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。