首页 > 解决方案 > 如何获取满足正则表达式条件的 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)因为这些行包含所需的字符串。我怎样才能得到我期望的答案?

标签: rdata.table

解决方案


用于lapply() 标识哪些列与正则表达式匹配。由于lapply()输出一个列表,因此用于Reduce(`|`, ...)验证每行是否至少有一个列满足 regexpr 条件:

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()以显示行索引。

结果:

> which(rowSums(sapply(data,function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x))) > 0)
[1] 2 3

推荐阅读