使用数据表中的正则表达式的grep名称

使用数据表中的正则表达式的grep名称,r,regex,data.table,R,Regex,Data.table,如何使用正则表达式模式从R数据表中grep列 我需要提取具有字符串“nbr[0-9].*的列,例如nbr1\u L或nbr6\u L names<- c("nbr4","nbr4_L", "nbr5" ,"nbr6_L", "nbr7_L" ,"nbr4_L" ,"nbr4_L") dt<- data.table(cbind("aa","bb","cc","dd","ff","gg","hh")) setnames(dt,names) 下面是

如何使用正则表达式模式从R数据表中grep列

我需要提取具有字符串“nbr[0-9].*的列,例如nbr1\u L或nbr6\u L

   names<- c("nbr4","nbr4_L",   "nbr5"  ,"nbr6_L",  "nbr7_L"    ,"nbr4_L"   ,"nbr4_L")
    dt<- data.table(cbind("aa","bb","cc","dd","ff","gg","hh"))
    setnames(dt,names)

下面是一种使用
%like%
的方法:

> idx <- names(dt) %like% '^nbr\\d+_.*'
> dt[, ..idx]
   nbr4_L nbr6_L nbr7_L nbr4_L nbr4_L
1:     bb     dd     ff     gg     hh
>idx dt[,…idx]
nbr4\u L nbr6\u L nbr7\u L nbr4\u L nbr4\u L
1:bb dd ff gg hh
如果您想grep
“nbr”
后面紧跟着一个数字,再加上一个下划线,再加上一个字符,请尝试以下操作:

grep("^nbr[[:digit:]]{1}_.$", names(dt), value = TRUE)
#[1] "nbr4_L" "nbr6_L" "nbr7_L" "nbr4_L" "nbr4_L"
因此,要对data.table进行子集划分

i <- grep("^nbr[[:digit:]]{1}_.$", names(dt), value = TRUE)
dt[, ..i]
#   nbr4_L nbr6_L nbr7_L nbr4_L nbr4_L
#1:     bb     dd     ff     bb     bb

没有数据时效果更好。表:

dt <- as.data.frame(dt)
dt[,grep("nbr[0-9]_",colnames(dt))]
#  nbr4_L nbr6_L nbr7_L nbr4_L.1 nbr4_L.2
#1     bb     dd     ff       gg       hh

dt我认为@mt1022有一个优秀、优雅的解决方案

但为了帮助OP,@Omer,进一步说,我只想指出,您尝试使用
.SD、.SDcols
几乎成功了

您当然可以使用这种方法-您的正则表达式模式只需要进行更正。例如,如果您所追求的是列名中的一位数字,则此功能将起作用:

dt[, .SD, .SDcols =  names(dt) %like% "nbr[0-9]_"]

   nbr4_L nbr6_L nbr7_L nbr4_L nbr4_L
1:     bb     dd     ff     gg     hh
更好的是,如果列的数字超过一位数,请使用:

dt[, .SD, .SDcols =  names(dt) %like% "nbr[0-9]+_"]

或者最好:替换他的解决方案中使用的@mt1022模式,该模式在开头添加
^
,这意味着只在字符串的开头查找匹配项<@mt1022的解决方案中的code>\\d
相当于上面的[0-9]。

grep(^nbr[[:digit:]{1}}.$”,names(dt),value=TRUE)
。您可以省略
{1}
,因为默认情况下
[:digit:]
将只匹配1位。
dt[, .SD, .SDcols =  names(dt) %like% "nbr[0-9]_"]

   nbr4_L nbr6_L nbr7_L nbr4_L nbr4_L
1:     bb     dd     ff     gg     hh
dt[, .SD, .SDcols =  names(dt) %like% "nbr[0-9]+_"]