1

我有以下向量:

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=""))
}

虽然不确定这种功能的效率......

4

1 回答 1

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"))
于 2013-09-28T19:20:43.823 回答