我可以强制 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 <- 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 的自定义数据强制;命名管道
使用 data.table 包滚动平均值到 R 中的多个变量
使用 R expss 和 data.table 是不是可以从 csv 文件加载 data.table 标签,而不是手动输入代码?