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

从R中的data.table中删除十六进制值,r,regex,data.table,R,Regex,Data.table,我有一个名为Site的大型数据表(300000行,100列)。整个数据表都是十六进制值,例如:“\x96”或“\xc9”。我希望删除所有这些值。它们的格式为“\x”,后跟两个字符(数字或字母) 下面是替换值的函数。我可以按如下所示单独执行每项操作,但我需要一个通用命令,该命令将删除表中的所有十六进制值 Site<- as.data.table(apply(Site, 2, function(x) gsub("\x8e", "", x))) 如何删除这些十六进制值?非常感谢您的帮助 以下是

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

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

Site<- as.data.table(apply(Site, 2, function(x) gsub("\x8e", "", x)))
如何删除这些十六进制值?非常感谢您的帮助

以下是一个可复制的示例:

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

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

很难找到帮助的相关部分<代码>?引号为我们提供了一块拼图<代码>“\x”或
“\x”
后跟除1或2位以外的任何数字(或a和f之间的字母)对R解析器都没有意义

“\x01”
“\x7f”
之间,可以找到“传统”ASCII表<例如,代码>相同(“\x30”,“0”),
相同(“\x39”,“9”)
相同(“\x41”,“A”)
相同(\x5A”,“Z”)
,都是
真的

然后在该符号允许的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不同)没有原始字符串,我怀疑这就是注释中最初混乱的原因。在Python中,您可以执行
“\\”
r“\”
在字符串中使用实际反斜杠,但在r中,您不能。您只能选择转义它:
“\\”
。在给出的regex101示例中,测试字符串中有
Th\xa1is
。但这与在R中执行
“Th\xa1is”

时的情况不同
(编辑:从R版本4.0开始,我们现在有了原始字符串:
R“(Th\xa1is)”
给出了
[1]“Th\\xa1is”

您能给出一个可重复的示例吗<代码>应用
几乎总是一个坏主意。你描述的正则表达式应该是
“\\x[a-ZA-Z0-9]{2}”
,我想。@Frank
a-z
不是
a-z
。可能只是一个输入错误。@Frank考虑到输入错误,命令不会删除字符。我还加了一个例子,你的要求我很难理解。为什么要删除字母
“E”
“\x45”
?我猜您想删除不在
“\x20”
“\x7e”
之间的字符,即拉丁字母和其他一些特殊字符。这将给出
dt[,lapply(.SD,gsub,pattern=“[^\x20-\x7e]”,replacement=“”)]
@Frank Sure。虽然我自己对这个问题不是很清楚。
       A      B
1:  This   This
2:    is     is
3:   the    the
4: first second
dt[, lapply(.SD, gsub, pattern = "[\x80-\xff]", replacement = "")]