【问题标题】:Remove hex values from data.table in R从 R 中的 data.table 中删除十六进制值
【发布时间】:2017-12-01 19:05:44
【问题描述】:

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

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

Site<- as.data.table(apply(Site, 2, function(x) gsub("\x8e", "", x)))

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

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

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

       A      B
1:  This   This
2:    is     is
3:   the    the
4: first second

【问题讨论】:

  • 你能举一个可重现的例子吗? apply 几乎总是一个坏主意。你描述的正则表达式是"\\x[a-ZA-Z0-9]{2}",我想。
  • @Frank a-z 不是 a-Z。可能只是一个错字。
  • @Frank 与拼写错误有关,该命令不会删除字符。我还添加了一个示例。
  • 您的要求对我来说是非常难以理解的。为什么要删除"\x45",即字母"E"?我猜您想删除不在"\x20" 和"\x7e" 之间的任何内容,即拉丁字母和一些其他特殊字符。那会给dt[, lapply(.SD, gsub, pattern = "[^\x20-\x7e]", replacement = "")]
  • @Frank 当然。虽然我自己对这个主题并不完全清楚。

标签: r regex data.table


【解决方案1】:

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

帮助的相关部分很难找到。 ?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" 之间,您将找到所谓的“拉丁 1”表的其余部分。

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

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

dt[, lapply(.SD, gsub, pattern = "[\x80-\xff]", replacement = "")]

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多