如何获得满足正则表达式条件的data.table中的行名?

时间:2019-05-10 13:55:50

标签: r data.table

假设我有一个data.table,如下所示:

data=data.table(dates=c('04 SEPTEMBER 2018', '05 APR 2018', '7/10/2018'), DT = c('21/07/2010', '3 04 2018', '16 DEC 2018'), amounts = c(21,37,49))

我想要满足以下grep条件的data.table中的行名

grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x) 

,以便我可以找到具有满足特定日期格式的日期的行。如您所见,列datesDT都包含日期格式。我不想引用代码中的特定列。我只想选择包含与上述grep模式匹配的字符的行。

我希望正确的代码返回c(2,3),因为这些行包含必需的字符串。如何获得期望的答案?

2 个答案:

答案 0 :(得分:2)

使用seeVisualDiffForElement标识哪些列与regexpr匹配。由于lapply()输出了一个列表,因此请使用lapply()来验证每行至少一列是否满足regexpr条件:

Reduce(`|`, ...)

结果:

data[
  data[, Reduce(`|`, lapply(.SD, function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x)))], 
  ]

更新

要获取存在匹配项的行的索引(对于任何列):使用> data[ + data[, Reduce(`|`, lapply(.SD, function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x)))], + ] dates amounts 1: 05 APR 2018 37 2: 16 DEC 2018 49 获取一个矩阵,其中包含指示匹配是否成功的单元格。然后,使用sapply()将其合并为一个值为rowSums(...) > 0(行中至少一个单元格具有成功匹配项)或TRUE(完全没有匹配项)的向量。将它们全部包装在FALSE中以显示行索引。

结果:

which()

答案 1 :(得分:1)

另一种data.table方法:

ans <- melt( transpose(data), 
             id.vars = NULL, 
             measure.vars = patterns("^V"), 
             variable.name = "row" )
ans <- ans[ grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}", value), ]
ans[, row := gsub("V", "", row)]
    row       value
 1:   2 05 APR 2018
 2:   3 16 DEC 2018

更新

data[ seq.int(.N) %in% ans$row, ]
          dates          DT amounts
 1: 05 APR 2018   3 04 2018      37
 2:   7/10/2018 16 DEC 2018      49
相关问题