假设我有一个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)
,以便我可以找到具有满足特定日期格式的日期的行。如您所见,列dates
和DT
都包含日期格式。我不想引用代码中的特定列。我只想选择包含与上述grep模式匹配的字符的行。
我希望正确的代码返回c(2,3)
,因为这些行包含必需的字符串。如何获得期望的答案?
答案 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