[英]grep names using regex from data table
如何使用正則表達式模式從R數據表中grep列。
我需要提取具有字符串“nbr [0-9] _”*的列,例如nbr1_L或nbr6_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)
我在下面試過
dt[, .SD, .SDcols = names(dt) %like% "nbr*_*"]
grep('^nbr\\d+\\_\\*$', names(dt), value=TRUE)
這是一種使用%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
如果你想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
請注意,您實際上不需要參數value = TRUE
:
j <- grep("^nbr[[:digit:]]{1}_.$", names(dt))
dt[, ..j]
# nbr4_L nbr6_L nbr7_L nbr4_L nbr4_L
#1: bb dd ff gg hh
沒有data.table可以更好地工作:
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
我認為@ 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]+_"]
或者BEST:替換他的解決方案中使用的模式@ mt1022,它在開頭添加^
意味着只在字符串的開頭找到匹配項。 \\\\d
在@ mt1022的解決方案是等同於[0-9]以上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.