我可以强制 R data.table %like% 使用“fixed = TRUE”吗?

Posted

技术标签:

【中文标题】我可以强制 R data.table %like% 使用“fixed = TRUE”吗?【英文标题】:Can I force R data.table %like% to use "fixed = TRUE"? 【发布时间】:2022-01-05 21:33:12 【问题描述】:

我有一个 data.table,我想确定一组代码是否存在于特定字符列中。我将模式作为值向量传递给%like%,如图所示。这种语法对我有用;但是,我想强制 %like% 函数将模式向量的每个元素视为文字,即不使用 . 作为正则表达式通配符。 data.table的手册说like函数可以设置为fixed = TRUE。有没有办法可以强制我的代码使用%like%... 视为文字而不是通配符?谢谢。 J

这有效,但处理“。”错误地作为通配符:

Codes <- c("65E..|9OX..|9OX1.|9OX2.|9OX3.|9OXZ.|Xaa9G")

ActualCodes <- dt[code_id %like% Codes] 

这不是:

Codes <- c("65E..|9OX..|9OX1.|9OX2.|9OX3.|9OXZ.|Xaa9G")

ActualCodes <- dt[code_id %like% Codes, fixed = TRUE] 

【问题讨论】:

你可以试试dt[like(code_id, Codes, fixed = TRUE)]。问题似乎是fixed = TRUE 被视为j 而不是like 的参数。此外,| 将在fixed = TRUE 中被视为字面意思。没有一个可重复的小例子就不清楚 我猜最好的选择是逃避你的.,即Codes &lt;- gsub(".", "\\.", Codes, fixed = TRUE),然后使用第一个选项 谢谢。我试过这个,但没有运气,无法通过转义“。”来使其工作。在代码中,使用“\\.”或如以下建议所示, "[.]" 。两者似乎都不适用于类似的功能,但很好的尝试。 【参考方案1】:

如果您查看?'%like%' 的帮助页面,您应该会看到like 有两种形式。您尝试使用的是中缀 tw0 参数版本,不接受 fixed =TRUE 参数。我确实尝试使用“un-anded”版本但失败了。起作用的是避开“固定”策略,而是使用字符类方法来获得“精确周期”:

DT = data.table(Name=c("65E..","65EXX","Xaa9G"), Salary=c(2,3,4))
DT
#---------------
    Name Salary
1: 65E..      2
2: 65EXX      3
3: Xaa9G      4


 
 DT[Name %like% "^Mar"]  # the example was copied from the help page
#Empty data.table (0 rows and 2 cols): Name,Salary
 Codes <- c("65E..|9OX..|9OX1.|9OX2.|9OX3.|9OXZ.|Xaa9G")
 DT[ Name %like%  Codes]
 #   Name Salary
#1: 65E..      2
#2: 65EXX      3       # WRONG, try again
#3: Xaa9G      4  

 
 Codes <- gsub("[.]", "[.]", Codes, fixed = TRUE)  #doesn't succeed
 Codes
#[1] "65E..|9OX..|9OX1.|9OX2.|9OX3.|9OXZ.|Xaa9G"  # wrong result, no matches

 Codes <- gsub("[.]", "[.]", Codes)   # remove "fixed", character class succeeds
 Codes
#[1] "65E[.][.]|9OX[.][.]|9OX1[.]|9OX2[.]|9OX3[.]|9OXZ[.]|Xaa9G"
 DT[ Name %like%  Codes]
# --- correct result----
    Name Salary
1: 65E..      2
2: Xaa9G      4   # SUCCESS

【讨论】:

Thx IRTFM,这似乎可行,也许 data.table 包需要一些修订/更新?我意识到这是一个奇怪的例子,为什么要输入 .或 * 几乎肯定会导致问题?这些是“读取”代码,直到最近才在英国用于记录医疗数据,很久以前由一位医生开发,可能在数据计算机化之前。 我无法让普通的 like 函数与我的简单 data.table 示例一起使用。我不知道为什么。我的猜测是它适用于 J 位置的按行操作,但我还没有测试过这个理论。你有 data.table 标签,所以它的维护者可能会得到这个。否则我可能会向他的 data.table github 页面提交问题。

以上是关于我可以强制 R data.table %like% 使用“fixed = TRUE”吗?的主要内容,如果未能解决你的问题,请参考以下文章

追加多个大data.table;使用 colClasses 和 fread 的自定义数据强制;命名管道

滚动连接R中的data.table

R之data.table 介绍

如何使这个 R data.table 代码更节省内存?

使用 data.table 包滚动平均值到 R 中的多个变量

使用 R expss 和 data.table 是不是可以从 csv 文件加载 data.table 标签,而不是手动输入代码?