1

次のベクトルがあります。

my.vector = c("4M1D5M15I1D10M", "3M", "4M2I3D")

そして、それを次のベクトルに変換したいと思います。

my.result = c("21N", "3N", "7N")

このような結果のロジックは次のとおりです。文字の"4M1D5M15I1D10M"前にある数字、つまり 4+1+5+1+10=21 を除くすべての数字を追加したためです"I"(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

を使用しない場合の解決策の 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 に答える