r - 使用 grep 对 data.table 中的行进行子集化,比较行内容

标签 r data.table string-matching

DT <- data.table(num=c("20031111","1112003","23423","2222004"),y=c("2003","2003","2003","2004"))

> DT
    num    y
1: 20031111 2003
2:  1112003 2003
3:    23423 2003
4:  2222004 2004

我想比较两个单元格的内容,并根据 bool 值执行一个 Action 。例如,如果“num”与年份匹配,则创建一个包含该值的列 x。我考虑过基于 grep 的子集,这很有效,但自然每次都检查 whole 列,这似乎很浪费

DT[grep(y,num)] # works with a pattern>1 warning

我可以 apply() 我的方式,但也许有 data.table 方式?

谢谢

最佳答案

如果您对使用 stringi 包感到满意,这是一种利用 stringi 函数矢量化模式和字符串这一事实的方法:

DT[stri_detect_fixed(num, y), x := num])

根据数据,它可能比 Veerenda Gadekar 发布的方法更快。

DT <- data.table(num=paste0(sample(1000), sample(2001:2010, 1000, TRUE)),
                 y=as.character(sample(2001:2010, 1000, TRUE)))
microbenchmark(
    vg = DT[, x := grep(y, num, value=TRUE, fixed=TRUE), by = .(num, y)],
    nk = DT[stri_detect_fixed(num, y), x := num]
)

#Unit: microseconds
# expr      min       lq     mean   median       uq      max neval
#   vg 6027.674 6176.397 6513.860 6278.689 6370.789 9590.398   100
#   nk  975.260 1007.591 1116.594 1047.334 1110.734 3833.051   100

关于r - 使用 grep 对 data.table 中的行进行子集化,比较行内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365768/

相关文章:

r - 有没有办法在不同版本的 H2O 之间使用保存的模型?

r - 在 r 中的 data.table 中缩放

Pdf中的R图标题编码

r - 减少 R 中的内存消耗——通过引用/data.table 传递

r - 使用 integer64 键连接错误

r - 没有读取功能吗?

c - 我需要帮助过滤 C 中的坏词吗?

string - 捕获量化正则表达式中的所有匹配项

R:使用通用图例比例分别绘制和保存光栅砖层

regex - 从大约 5 个单词中以任意顺序匹配至少 3 个单词