gsub производит диапазон, а не желаемое выражение в R - PullRequest
0 голосов
/ 13 июля 2020

Я хотел бы прочитать в таблице, а затем использовать gsub для возврата части текста. Я знаю, что для gsub требуется векторный формат символов. Вместо получения желаемого списка сампов «C516_A1_B1» и списка патчей «C516» и c я получаю «1: 5». Как это исправить проще всего? Спасибо!

bamlist <- read.table('pathtotxtfile.txt')

for (y in bamlist) {
    samp <- gsub('EPICC_(C\\S+)_S1\\S+$','\\1', bamlist)
    pat <- gsub('(C\\d+)_\\S+$','\\1', samp)
}

bamlist:

EPICC_C516_A1_B1_S1-GRCh38.bam
EPICC_C516_A1_G4_S1-GRCh38.bam
EPICC_C516_B1_G7_S1-GRCh38.bam
EPICC_C516_B1_G8_S1-GRCh38.bam
EPICC_C516_B3_B1_S1-GRCh38.bam

1 Ответ

2 голосов
/ 13 июля 2020

Почему l oop, sub векторизуется поверх x.

samp <- sub("^[^_]*_(.*)_[^_]*$", "\\1", bamlist)
pat <- sub("(^[^_]+)_.*$", "\\1", samp)

samp
#[1] "C516_A1_B1" "C516_A1_G4" "C516_B1_G7" "C516_B1_G8"
#[5] "C516_B3_B1"
pat
#[1] "C516" "C516" "C516" "C516" "C516"

Data

bamlist <- scan(what = character(), text = "
EPICC_C516_A1_B1_S1-GRCh38.bam
EPICC_C516_A1_G4_S1-GRCh38.bam
EPICC_C516_B1_G7_S1-GRCh38.bam
EPICC_C516_B1_G8_S1-GRCh38.bam
EPICC_C516_B3_B1_S1-GRCh38.bam
")

Edit

Следуя за комментарием пользователя @ akrun, вот способ применить приведенный выше код к data.frame.

lapply(bamlist, function(y){
  samp <- sub("^[^_]*_(.*)_[^_]*$", "\\1", y)
  pat <- sub("(^[^_]+)_.*$", "\\1", samp)
  data.frame(samp = samp, pat = pat)
})
#$X
#        samp  pat
#1 C516_A1_B1 C516
#2 C516_A1_G4 C516
#3 C516_B1_G7 C516
#4 C516_B1_G8 C516
#5 C516_B3_B1 C516

Теперь данные будут

X <- scan(what = character(), text = "
EPICC_C516_A1_B1_S1-GRCh38.bam
EPICC_C516_A1_G4_S1-GRCh38.bam
EPICC_C516_B1_G7_S1-GRCh38.bam
EPICC_C516_B1_G8_S1-GRCh38.bam
EPICC_C516_B3_B1_S1-GRCh38.bam
")

bamlist <- data.frame(X)
...