У меня такой вектор:
my.vector = c("4M1D5M15I1D10M", "3M", "4M2I3D")
И я хотел бы преобразовать его в следующий вектор:
my.result = c("21N", "3N", "7N")
Логика таких результатов следующая: для "4M1D5M15I1D10M"
я добавил все числа, кроме тех, которые предшествуют символу "I"
, то есть 4 + 1 + 5 + 1 + 10 = 21 (я не добавил 15, потому что он предшествует символу "I"
). "I"
), а затем вставьте N сразу после 21, превратившись в "21N"
.
То же самое для "3M"
, здесь нет символа "I"
, поэтому он просто становится "3N"
; и то же самое для последнего, 4 + 3 = 7 (я не добавил 2, потому что он предшествует "I"
), становится "7N"
.
Обратите внимание, что my.vector очень большой, поэтому я хочу использовать параллельные возможности сервера HPC с помощью mclapply. В идеале я бы запустил что-то вроде этого, чтобы получить свой результат:
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=""))
}
Хотя не уверен в эффективности такой функции ...
mclapply
для каждой небольшой операции в вашем коде, потому что есть накладные расходы, связанные со сбором результатов. Вам, вероятно, будет лучше векторизовать как можно больше и использоватьmclapply
на более крупных логических объектах, но я просто предполагаю, поскольку вы показываете нам только один крошечный фрагмент своего проекта за раз. - person GSee   schedule 28.09.2013