如何使用 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
包中的默认类型。
我有一个 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
包中的默认类型。