从R中的data.table中删除十六进制值
我有一个名为Site的大型数据表(300000行,100列)。整个数据表都是十六进制值,例如:“\x96”或“\xc9”。我希望删除所有这些值。它们的格式为“\x”,后跟两个字符(数字或字母) 下面是替换值的函数。我可以按如下所示单独执行每项操作,但我需要一个通用命令,该命令将删除表中的所有十六进制值从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<- 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}”
,我想。@Franka-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 = "")]