使用数据表中的正则表达式的grep名称
如何使用正则表达式模式从R数据表中grep列 我需要提取具有字符串“nbr[0-9].*的列,例如nbr1\u L或nbr6\u L使用数据表中的正则表达式的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) 下面是
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]+_"]