我看到过关于删除R中特殊字符的各种帖子(比如这篇:从R中的字符串中删除所有特殊字符?(,但这些策略都不适用于我的问题。
我有一个用qdap的read.transcript((读取的成绩单。当我在文档中读取时,它会使带有特殊字符的行看起来像这样:
If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!
我试过:
ATL1$X2 <- gsub("[^0-9A-Za-z///,.?()' ]", "", ATL1$X2)
If anyone knows how to simply change these special characters (i.e e1b89d to e), again please feel free to update
但这并没有删除特殊字符,也删除了!
我也试过:
str_replace_all(ATL1$X2, "[^[:alnum:]]", " ")
If anyone knows how to simply change these special characters i e e1 b8 9d to e again please feel free to update
但更糟糕的是,删除了所有标点符号,仍然无法解决我的问题。
最后,我也尝试过:
iconv(ATL1$X2, from = 'UTF-8', to = 'ASCII//TRANSLIT')
If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!
但这里也没有什么变化。
在理想的世界里,输出看起来像:
If anyone knows how to simply change these special characters (i.e e e e to e), again please feel free to update!
因此,特殊字符是按照它们"应该"的样子读取的。如果这不可能,老实说,如果它只是删除了特殊字符(但没有删除其他字符,如感叹号(,并看起来像这样,我会没事的:
If anyone knows how to simply change these special characters (i.e to e), again please feel free to update!
谢谢!
有几件事让这件事变得困难:
- 您想要用通常相同的东西来替换字符,而不仅仅是转换编码。在您的示例中,"<e1><b8><9d>"不代表"e",它代表"e的复杂版本,这意味着R不会只是改变它。但有一些函数可以做到这一点
- 看起来
qdap.transcript
试图提供帮助。至少你在这里显示的内容和你的结果是一致的,它们不是是特殊字符,而是字面上的"<e1><b8><9d>"。因此,如果您尝试删除特殊字符,gsub
很乐意遵守,并删除"<"one_answers">",只保留"e1"等
为了解决您的问题,我认为您需要转换回特殊字符,然后使用stringi
包中的stri_trans_general
。我相信还有其他类似的功能,但这一个对我有效。事实证明,转换回特殊字符是困难的部分,但我有一些工作代码:
library(stringi)
mystring <- 'If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!'
pos <- gregexpr('(<[A-Fa-f0-9]{2}>)+', mystring)[[1]]
replace <- substring(mystring, pos, pos+attr(pos, 'match.length')-1)
replace <- sapply(replace, function(r) {
eval(parse(text=paste0(''', gsub('>', '', gsub('<', '\\x', r)), ''')))
})
for(i in seq_along(replace)) {
mystring <- sub('(<[A-Fa-f0-9]{2}>)+', replace[i], mystring)
}
mystring <- stri_trans_general(mystring, 'latin-ascii')
我们首先提取"<"one_answers">"之间看起来像十六进制的所有值,然后将它们转换为文字"\xe1\xb8\x9d",然后要求R处理它,并用这些替换值替换旧值
仅在最后一行,我们将特殊字符替换为(在本例中("e">