我有一个名为Site的大型数据表(300,000行,100列)。整个数据表中都是十六进制值,例如:" \ x96"或" \ xc9。"我希望删除所有这些值。它们遵循" \ x"的格式。后跟两个字符(数字或字母)。
这是替换值的函数。我可以单独执行每个操作,如下所示,但我想要一个通用命令,它将删除表中的所有十六进制值。
Site<- as.data.table(apply(Site, 2, function(x) gsub("\x8e", "", x)))
我尝试使用正则表达式语法&#34; \ x ..&#34;,但出现此错误:
Error: '\x' used without hex digits in character string starting ""\x"
如何删除这些十六进制值?非常感谢任何帮助!
这是一个可重复的例子:
dt <- data.table(A = c("Th\xa1is","is","the","first\x12"), B = c("This","\x45is","the","second"))
我想&#34; \ xa1&#34;,&#34; \ x12&#34;和&#34; \ x45&#34;删除所以表格如下:
A B
1: This This
2: is is
3: the the
4: first second
答案 0 :(得分:2)
帮助的相关部分很难找到。 ?Quotes
给了我们一个难题。 "\x"
或"\x"
后跟除1或2位数字(或a和f之间的字母)之外的任何内容,甚至对R解析器都没有意义。
在"\x01"
和"\x7f"
之间,您会找到传统的&#34; ASCII表。例如,identical("\x30", "0")
,identical("\x39", "9")
,identical("\x41", "A")
,identical("\x5A", "Z")
都是TRUE
。
然后,在此表示法允许的128个其他值中,在"\x80"
和"\xff"
之间,您将找到所谓的&#34;拉丁语1&#34;表
然后有所有其他字符的Unicode,以及无处不在的UTF-8编码。
因此,当您说&#34;删除所有十六进制值&#34;时,只能假设"\x80"
和"\xff"
之间的字符会给您带来麻烦。也许这些字符的显示方式存在问题。或编码问题。或者其中一些只是控制角色。但是,让我们按照你的要求删除所有内容:
dt[, lapply(.SD, gsub, pattern = "[\x80-\xff]", replacement = "")]
应该这样做。或者如果你想更加激进,并删除非ASCII的所有内容:dt[, lapply(.SD, gsub, pattern = "[^\x01-\x7f]", replacement = "")]
。
同样值得注意的是:R(与Python不同)没有原始字符串,我怀疑评论中的初始混淆源于此。在Python中,您可以"\\"
或r"\"
在字符串中使用实际的反斜杠,在R中,您不能这样做。您只能选择转义它:"\\"
。在给出的regex101示例中,测试字符串中有Th\xa1is
。但是当你执行"Th\xa1is"
时,这与你在R中所拥有的不同。