Эффективный способ разделить вектор сигар с помощью mclapply

У меня очень большой вектор сигар:

my.vector = c("44M2D1I","32M465N3M", "3S4I3D45N65M")

Это я хотел бы преобразовать в вектор разделенных сигар - логика такова: всякий раз, когда я нахожу число, за которым следует N, я должен разделить его, поэтому я разделил "32M465N3M" на "32M" 465Н","3М"; и «3С4И3Д45Н65М» на «3С4И3Д», «45Н», «65М»; и "44M2D1I" не разделялся, потому что в нем не было "N".

my.vector.split = c("44M2D1I, "32M", "465N", "3M", "3S4I3D", "45N", "65M").

Мой вектор очень велик, поэтому в идеале я хотел бы использовать параллельные возможности кластера. Я хотел бы использовать mclapply с ncores.

В идеале я хотел бы определить что-то вроде этого:

 my.vector.split = unlist(mclapply(my.vector, my.splitting.function, mc.cores = ncores))

где длина my.vector.split равна длине (my.vector) + (количество Ns) * 2.

Примечание. В кластере HPC, который я использую, не установлена ​​последняя версия биокондуктора, поэтому я не могу использовать cigartoRleList и другие полезные инструменты для работы с сигарами.


person Dnaiel    schedule 28.09.2013    source источник
comment
@Gsee, извините, да, это результат. Я изменил его на правильную версию.   -  person Dnaiel    schedule 28.09.2013
comment
@Dualinity, это вектор символов, представляющий выравнивание считываний с эталонными геномами - подробнее здесь: samtools.sourceforge. net/SAMv1.pdf на странице 5, пункт 5.   -  person Dnaiel    schedule 28.09.2013


Ответы (1)


Это должно быть применимо. Детали будут различаться в зависимости от того, как вы настроили свои кластеры, но в основном это вернет серию данных. Если вы хотите, чтобы они были векторами, оберните их unlist:

 lapply(gsub("([[:digit:]]+N)", ",\\1,", my.vector) , 
         function(x) unlist( read.table(text=x,sep=",",colClasses="character")) )
#------------
[[1]]
       V1 
"44M2D1I" 

[[2]]
    V1     V2     V3 
 "32M" "465N"   "3M" 

[[3]]
      V1       V2       V3 
"3S4I3D"    "45N"    "65M" 
person IRTFM    schedule 28.09.2013
comment
Я думаю, что это будет очень медленно. Я думал в том же духе, что и strsplit(gsub("(\\d+N)", "_\\1_", my.vector), "_"), но многие из них не так способствуют mclapply. Кроме того, должен быть способ не использовать и strsplit, и gsub. - person GSee; 28.09.2013
comment
@Gsee, ммм, если вы думаете, что это может быть неэффективно, вы можете быть правы ... Мы могли бы использовать strsplit напрямую, если strsplit не избавляется от символа соответствия ... stat.ethz.ch/pipermail/r-devel/2006-April/037120.html... но похоже этот вариант еще не реализован... - person Dnaiel; 28.09.2013
comment
Я предположил, что вы хотите проанализировать результат gsub. В качестве альтернативы вы можете использовать gregexpr или regexec для определения мест для substr извлечения. - person IRTFM; 28.09.2013