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)
这样我就可以找到日期满足特定日期格式的行。如您所见,这两个列dates
都DT
包含日期格式。我不想引用代码中的特定列。我只想选择包含与上述 grep 模式匹配的字符的行。
我希望返回正确的代码,c(2,3)
因为这些行包含所需的字符串。我怎样才能得到我期望的答案?
解决方案
用于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
推荐阅读
- sql - 如何在 PostgreSQL 中将文本列转换为时间戳列?
- python - 将 rpy2.robjects.vectors.DataFrame 转换为 Pandas DataFrame
- flutter - 如何从共享偏好中获取价值?我有未来和等待的问题
- javascript - 添加新元素时如何锁定滚动选项不消耗?(没有溢出:隐藏)
- c# - DependencyProperty 未设置其值
- amazon-web-services - EKS:如何减少 AZ 之间的数据传输?
- python - 理解 exe/dll 文件的编码
- bluetooth - 如何找到我的 Mulitmeter 的服务 UUID
- c++ - 输入 gpio 意外触发中断
- python - 使用涉及 shift() 的其他列的最大值创建一个新的 df 列