【问题标题】:grep names using regex from data table使用数据表中的正则表达式 grep 名称
【发布时间】:2018-09-19 11:50:07
【问题描述】:

如何使用正则表达式模式从 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)

【问题讨论】:

  • grep("^nbr[[:digit:]]{1}_.$", names(dt), value=TRUE).

标签: r regex data.table


【解决方案1】:

这是使用%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

【讨论】:

    【解决方案2】:

    没有 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
    

    【讨论】:

      【解决方案3】:

      如果您想 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
      

      【讨论】:

      • 您可以省略{1},因为默认情况下[[:digit:]] 将只匹配一位数字。
      【解决方案4】:

      我认为@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 的解决方案中的\\d 相当于上面的[0-9]。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多