如何使用 data.table 使用正则表达式过滤 R 中的行(数字)

How to filter rows (numeric) in R with regular expressions using data.table

我有一个 data.table 看起来像这样:

ID         Name
9123000000 Alf
9123400000 Olive
8123000000 Gary 

dt[grep("000000$", ID)]

我尝试过滤包含下一个正则表达式“000000$”的行,但没有 return 任何结果。我检查了一个常规匹配应用程序,它是正确的。我究竟做错了什么? 我期望的结果只有名称为 Alf 和 Gary 的行。

这些都是大数字。我们可能需要特殊包裹

library(gmp)
grep("000000$", as.bigz(v1))
[1] 1
grep("000000$", v1)
integer(0)

因此,在OP的示例中,它应该是

dt[grep("000000$", as.bigz(ID))]

数据

v1 <- c(9123000000, 9123400000)

因为它们是数字,所以 grepl 转换为字符可能会看到科学记数法:

as.character(dt$ID)
# [1] "9.123e+09"  "9123400000" "8.123e+09" 

我们可以使用 sprintf:

来解决这个问题
sprintf("%0.0f", dt$ID)
# [1] "9123000000" "9123400000" "8123000000"

(我假设您没有或不关心小数。)

因此,过滤器应该是可行的

dt[grepl("000000$", sprintf("%0.0f", ID)),]
#           ID   Name
#        <num> <char>
# 1: 9.123e+09    Alf
# 2: 8.123e+09   Gary

如果您安装 bit64 包,那么 fread() 可以将具有巨大数字的列导入为 integer64 类型,这是 bit64 包中的默认类型。