【问题标题】:Efficient way to add-up all numbers except the ones that accompany an I using mclapply使用 mclapply 将所有数字相加的有效方法,除了伴随 I 的数字
【发布时间】: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 好得多。

标签: r mclapply


【解决方案1】:

这里有一个没有mclapply的解决方案,请检查是否可行:

L <- regmatches(my.vector, gregexpr("(\\d+)(?=[A-HJ-Z])", my.vector, perl=TRUE))
sapply(L, function(x)paste0(sum(as.numeric(x)),"N"))

【讨论】:

  • 可以sapply替换为mclapply ;)
猜你喜欢
  • 2011-08-14
  • 2021-08-12
  • 2014-05-23
  • 2015-04-26
  • 2014-05-15
  • 2012-03-02
  • 1970-01-01
  • 2020-12-10
  • 2016-04-06
相关资源
最近更新 更多