我有一个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]))
答案 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
矢量实际上是即时的。