Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何获取data.table中满足正则表达式条件的行的名称?_R_Data.table - Fatal编程技术网

R 如何获取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.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) 
这样我就可以找到符合特定日期格式的日期行。如您所见,两列
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”)