簡體   English   中英

grep使用數據表中的正則表達式命名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM