【发布时间】:2013-10-04 22:05:35
【问题描述】:
我有以下向量:
my.vector = c("4M1D5M15I1D10M", "3M", "4M2I3D")
我想把它转换成下面的向量:
my.result = c("21N", "3N", "7N")
这样的结果的逻辑如下,
对于"4M1D5M15I1D10M",我添加了所有数字,除了"I" 字符之前的数字,即4+1+5+1+10=21(我没有添加15,因为它在"I" 之前),然后在 21 之后粘贴一个 N,变成"21N"。
"3M" 也一样,没有"I" 字符所以它变成"3N";
最后一个也一样,4+3=7(我没有加 2,因为它在 "I" 之前),变成了 "7N"。
请注意,my.vector 非常大,因此我想通过 mclapply 使用 HPC 服务器的并行功能。理想情况下,我会运行这样的东西来得到我的结果:
my.result = unlist(mclapply(my.vector, my.adding.function, mc.cores = ncores))
为了定义我的功能,我尝试了以下方法:
my.adding.function <- function(x)
{
tmp = unlist(strsplit(x, "\\d+I"))
tmp2 = unlist(strsplit(tmp, "M|D|S|N"))
tmp3 = sum(as.numeric(tmp2))
return(paste(tmp3, "N",sep=""))
}
虽然不确定这种功能的效率...
【问题讨论】:
-
@Gsee,好点,把它放在那里。
-
@Gsee,基本上,我正在尝试学习如何在 R 中工作,这样操作就不会花费很长时间来处理大量数据。我已经实现了一些代码,但是当我运行它时,它需要永远并且永远不会完成,所以我试图优化每一步,因此 mclapply 等......我可以编写自己的函数来完成我想要的大部分事情,但他们最终变得很慢。
-
最好的解决方案不太可能是对代码中的每个小操作都使用
mclapply,因为收集结果会产生开销。你可能会更好,尽可能多地矢量化,并在更大的逻辑块上使用mclapply,但我只是猜测,因为你一次只向我们展示你项目的一小部分。跨度> -
@Gsee,这很有意义,这是一个很好的建议,我现在在每次操作后打印时间戳,这样我就可以很好地了解瓶颈。附带说明一下,对于少量操作,mclapply 开销比 foreach 和 parLapply 好得多。