从 R 中的 data.table 中删除十六进制值

Mic*_*erk 5 regex r data.table

我有一个名为 Site 的大型数据表(300,000 行,100 列)。整个数据表都是十六进制值,例如:“\x96”或“\xc9”。我希望删除所有这些值。它们遵循“\x”后跟两个字符(数字或字母)的格式。

这是替换值的函数。我可以单独执行每个操作,如下所示,但我想要一个通用命令来删除表中的所有十六进制值。

Site<- as.data.table(apply(Site, 2, function(x) gsub("\x8e", "", x)))
Run Code Online (Sandbox Code Playgroud)

我尝试使用正则表达式语法“\x..”,但收到此错误:

Error: '\x' used without hex digits in character string starting ""\x"
Run Code Online (Sandbox Code Playgroud)

如何删除这些十六进制值?任何帮助是极大的赞赏!

这是一个可重现的示例:

dt <- data.table(A = c("Th\xa1is","is","the","first\x12"), B = c("This","\x45is","the","second"))
Run Code Online (Sandbox Code Playgroud)

我想删除“\xa1”、“\x12”和“\x45”,以便表格看起来像:

       A      B
1:  This   This
2:    is     is
3:   the    the
4: first second
Run Code Online (Sandbox Code Playgroud)

Aur*_*èle 5

你很困惑。我也是。我们大多数人也是。字符、它们的编码和显示。

帮助的相关部分很难找到。?Quotes给了我们一块拼图。"\x""\x"后跟除 1 或 2 位数字(或 a 和 f 之间的字母)之外的任何内容对于 R 解析器来说甚至没有意义。

在 和 之间"\x01""\x7f"会找到“传统”ASCII 表。例如identical("\x30", "0")identical("\x39", "9"), identical("\x41", "A"), , , 都是。identical("\x5A", "Z")TRUE

然后,在该表示法允许的 128 个其他值中,在"\x80"和 之间"\xff",您将找到所谓的“Latin 1”表的其余部分。

然后是所有其他字符的 Unicode,以及无处不在的 UTF-8 编码。

因此,当您说“删除所有十六进制值”时,人们只能假设 和 之间的"\x80"字符"\xff"是困扰您的字符。也许这些字符的显示方式有问题。或者编码问题。或者其中一些只是控制字符。但让我们按照您的要求将它们全部删除:

dt[, lapply(.SD, gsub, pattern = "[\x80-\xff]", replacement = "")]
Run Code Online (Sandbox Code Playgroud)

应该做。或者,如果您想更激进,请删除所有非 ASCII 的内容:dt[, lapply(.SD, gsub, pattern = "[^\x01-\x7f]", replacement = "")]

另外值得注意的是:R(与 Python 不同)没有原始字符串,我怀疑这就是注释中最初的混乱的根源。在 Python 中,您可以在字符串中执行"\\"r"\"在字符串中使用实际的反斜杠,但在 R 中则不能。你只能选择逃避它:"\\"。在给出的 regex101 示例中,Th\xa1is测试字符串中有 。但这与您在 R 中执行的操作不同"Th\xa1is"
编辑:从 R 版本 4.0 开始,我们现在有了原始字符串:r"(Th\xa1is)"给出[1] "Th\\xa1is"