R 如何获取data.table中满足正则表达式条件的行的名称?
假设我有一个data.table,如下所示:R 如何获取data.table中满足正则表达式条件的行的名称?,r,data.table,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)) 我希望data.table中的行名满足以下grep条件 grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x) 这样我就可以
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))
我希望data.table中的行名满足以下grep条件
grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x)
这样我就可以找到符合特定日期格式的日期行。如您所见,两列dates
和DT
都包含日期格式。我不想引用代码中的特定列。我只想选择包含与上述grep模式匹配的字符的行
我希望正确的代码返回c(2,3)
,因为这些行包含所需的字符串。如何获得我期望的答案?使用lappy()
来标识与regexpr匹配的列。由于lappy()
输出一个列表,因此使用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
> which(rowSums(sapply(data,function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x))) > 0)
[1] 2 3
更新
要获取匹配行的索引(对于任何列):使用sapply()
获取一个矩阵,其中的单元格指示匹配是否成功。然后使用行和(…)>0
将其合并为一个值为TRUE
(行中至少有一个单元格成功匹配)或FALSE
(完全没有匹配)的向量。将其全部包装在which()
中以显示行索引
结果:
> 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
> which(rowSums(sapply(data,function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x))) > 0)
[1] 2 3
使用lappy()
标识与regexpr匹配的列。由于lappy()
输出一个列表,因此使用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
> which(rowSums(sapply(data,function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x))) > 0)
[1] 2 3
更新
要获取匹配行的索引(对于任何列):使用sapply()
获取一个矩阵,其中的单元格指示匹配是否成功。然后使用行和(…)>0
将其合并为一个值为TRUE
(行中至少有一个单元格成功匹配)或FALSE
(完全没有匹配)的向量。将其全部包装在which()
中以显示行索引
结果:
> 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
> which(rowSums(sapply(data,function(x) grepl("^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}",x))) > 0)
[1] 2 3
另一种数据表方法:
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)]
更新
data[ seq.int(.N) %in% ans$row, ]
另一种数据表方法:
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)]
更新
data[ seq.int(.N) %in% ans$row, ]
请尝试
which(grepl(“^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}”,数据$dates))
或grep(^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4},数据$dates)
我更喜欢在不特别提及特定列名的情况下获取名称。我假设我不知道包含日期的列的名称。这是一个完全不同的问题。在你的尝试中,你也提到了列名日期
我将进行必要的编辑。你的问题仍然很模糊。我们怎么知道这个专栏?所有其他列是否都是数字和日期
字符?它是否始终位于数据集中的特定位置?请尽量明确。除非您想将其应用于每一列…?which(grepl(^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4},data$dates))
或grep(^[0-9]{2}\\s[A-Z]{3}\\s[0-9]{4}),data$dates)
我更喜欢在不特别提及特定列名的情况下获取名称。我假设我不知道包含日期的列的名称。这是一个完全不同的问题。在你的尝试中,你也提到了列名日期
我将进行必要的编辑。你的问题仍然很模糊。我们怎么知道这个专栏?所有其他列是否都是数字和日期
字符?它是否始终位于数据集中的特定位置?请尽量明确。除非您想将其应用于每一列…?不幸的是,这不会返回行索引2和3,这是解决方案,不是吗?结果在哪一列?您的结果显示为行本身,而不是它们的指示符。它返回第2行和第3行,是。你到底在找什么?实际的索引“2”和“3”?我得到的是c(1,2)而不是c(2,3),好的,那么您希望输出是“2”“3”
?它返回与正则表达式匹配的行。不确定是要返回行索引还是要返回行。不幸的是,这不会返回行索引2和3,这是解决方案,不是吗?结果在哪一列?您的结果显示为行本身,而不是它们的指示符。它返回第2行和第3行,是。你到底在找什么?实际的索引“2”和“3”?我得到的是c(1,2)而不是c(2,3),好的,那么您希望输出是“2”“3”
?它返回与正则表达式匹配的行。不确定是要返回行索引还是要返回行。是否有办法只获取行?抱歉,我指的是没有实际行的行名…抱歉,这是我的错误数据。表不支持行名(这是我一直被告知的)。如果只需要行号,请使用ans$row
。。。它返回c(“2”,“3”)
是否有办法只获取行数?抱歉,我是指没有实际行数的行名…抱歉,这是我的错误数据。表不支持行名(这是我一直被告知的)。如果您只需要行数,请使用ans$row
。。。它返回c(“2”、“3”)