如何在R中加速这个正则表达式?

时间:2016-07-17 21:02:23

标签: regex r performance

我有一个150万行的中等因素。数据是(15.500593489554, -98.593930203954)形式的坐标。

我想提取每个坐标,将其转换为数字,并将它们放在不同的列中。问题是我写的代码需要很长时间才能吃掉所有内存(8 GB),R崩溃,并且我的计算机锁定了。即使在重新启动R后,它仍保持99%的物理内存使用率。

以下是我用来从因子中提取第一个坐标的代码:

library(stringr)
sapply(dat, function(x) as.numeric(str_match(x, "([.0-9]+),")[,2]))

由于这不起作用,我决定对数据集进行子集化,发现在100行上执行命令需要几秒钟。 1000行大约需要25秒。因此,即使我将数据拆分成块,单独处理它们并将其重新组合在一起也需要花费很多时间。

有没有更好的方法来解决这个问题?我无法弄清楚如何使用我的regex命令与基础R(grep()gsub()等)。 str_match()只是慢一点吗?

以下是模仿数据结构的示例数据集:

dat <- factor(replicate(1500000, paste("(", runif(1, 0, 150), ", ", runif(1, -150, 0), ")", sep = "")))

作为参考,这是我的正则表达式,用于提取对的第二个坐标:

as.numeric(str_match(x, "([-.0-9]+)\\)")[,2]))

1 个答案:

答案 0 :(得分:4)

将数据拆分为逗号并删除第一个和最后一个字符:

splits = strsplit(as.character(substr(dat,2,nchar(as.character(dat))-1)),",")

然后将其转换为数字矩阵:

> xy = matrix(as.numeric(do.call(rbind,splits)),ncol=2) 
> dat[1:10]
 [1] (86.1234028358012, -6.26554019981995) (141.88499195734, -28.9505033288151) 
 [3] (48.9979103207588, -85.1732837269083) (22.5762162473984, -3.01207801094279)
 [5] (81.2530122930184, -26.4870180166326) (71.918728435412, -86.2695457180962) 
 [7] (1.14843629999086, -25.0385148217902) (90.2961491374299, -55.1420112024061)
 [9] (7.83875549677759, -58.2294602994807) (108.123476186302, -10.3448686539195)
1000 Levels: (0.0320718856528401, -10.3856220259331) ...
> head(xy)
          [,1]       [,2]
[1,]  86.12340  -6.265540
[2,] 141.88499 -28.950503
[3,]  48.99791 -85.173284
[4,]  22.57622  -3.012078
[5,]  81.25301 -26.487018
[6,]  71.91873 -86.269546

我的笔记本电脑上的10万个dat矢量实际上是即时的。