我可以强制 R data.table %like% 使用 "fixed = TRUE" 吗?
Can I force R data.table %like% to use "fixed = TRUE"?
我有一个 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]
如果您查看 ?'%like%'
的帮助页面,您应该会看到 like
有两种形式。您尝试使用的是中缀、tw0 参数版本,并且不接受 fixed =TRUE
参数。我确实尝试使用“un-ampersanded”版本但失败了。有效的方法是避开“固定”策略,而是使用字符 class 方法来获得“精确周期”:
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
我有一个 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]
如果您查看 ?'%like%'
的帮助页面,您应该会看到 like
有两种形式。您尝试使用的是中缀、tw0 参数版本,并且不接受 fixed =TRUE
参数。我确实尝试使用“un-ampersanded”版本但失败了。有效的方法是避开“固定”策略,而是使用字符 class 方法来获得“精确周期”:
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