1

我看过各种关于删除 R 中的特殊字符的帖子(例如这篇文章:Remove all special characters from a string in 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!

谢谢!

4

1 回答 1

4

有几件事使这变得困难:

  1. 您想用通常相同的东西替换字符,而不仅仅是转换编码。在您的示例中,“<e1><b8><9d>”不代表“e”,它代表“e”的复杂版本,这意味着 R 不会仅仅改变它。但是有一些功能可以做到这一点
  2. 看起来qdap.transcript试图提供帮助。至少您在此处显示的内容以及您的结果是一致的,它们不是特殊字符,而只是字面上的“<e1><b8><9d>”。因此,如果您尝试删除特殊字符,请gsub愉快地遵守并删除“<”和“>”,留下“e1”等等。

为了解决你的问题,我想你想转换回特殊字符,然后stri_trans_generalstringi包中使用。我敢肯定还有其他类似的功能,但这个对我有用。事实证明,转换回特殊字符是困难的部分,但我有一些工作代码:

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')

我们首先提取“<”和“>”之间看起来像十六进制的所有内容,然后将它们转换为文字“\xe1\xb8\x9d”,然后让 R 处理它,并用这些替换替换旧值。
仅在最后一行,我们将特殊字符替换为(在此示例中)“e”

于 2018-12-11T19:25:20.777 回答