L oop только с учетом первого элемента множественного условия - PullRequest
0 голосов
/ 21 июня 2020

Я запускаю этот l oop, чтобы обнаружить некоторые специфические c символьные элементы столбца фрейма данных для их перезаписи. Я хочу найти все элементы, соответствующие одному из этих шаблонов 'H309' или 'H2020', и переписать их.

Все символы этого столбца следуют этому шаблону:

coord;number;strand;id;rate;name;tissue

В то время как те, у кого есть H309 или H2020 в качестве имени, представляют этот другой шаблон:

coord;rate;number;id;strand;name

Например:

seqnames                                          Score

coord1;nb1;strand1;id1;rate1;X77I;bladder           1
coord2;nb2;strand2;id2;rate2;YH7;bone               2
coord3;rate3;nb3;id3;strand3;H309                   3
coord4;nb4;strand4;id4;rate4;LÑB;brain              4
coord5;rate5;nb5;id5;strand5;H2020                  5
.                                                   .
.                                                   .
.                                                   .
.                                                   .

Итак, я хочу, чтобы эти символы следовали образцу остальных, что я пытался сделать:

for (i in 1:nrow(df){
if (grepl("H309", df$seqnames[i]) == TRUE || grepl("H2020", df$seqnames[i]) == TRUE){
    a = str_split(df$seqnames[i], ";")
    df$seqnames[i] <- paste(a[[1]][1], a[[1]][3], a[[1]][5], a[[1]][4], a[[1]][2],a[[1]][[6]],'Lung', sep=';')
  }
}

Проблема в том, что l oop работает только с H309 элементами, и не с H2020.

Итак, теперь H309 образцов также представляют этот шаблон: coord;number;strand;id;rate;name;tissue

Хотя H2020 по-прежнему представляет другой образец: coord;rate;number;id;strand;name

Как я могу это решить?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

df <- read.table(text = "seqnames                                          Score
coord1;nb1;strand1;id1;rate1;X77I;bladder           1
coord2;nb2;strand2;id2;rate2;YH7;bone               2
coord3;rate3;nb3;id3;strand3;H309                   3
coord4;nb4;strand4;id4;rate4;LÑB;brain              4
coord5;rate5;nb5;id5;strand5;H2020                  5", header = TRUE)


indx <- grep("H(\\d+)$", df$seqnames) 

df$seqnames[indx] <- paste0(df$seqnames[indx], ";Lung")

changes <-  strsplit(df$seqnames[indx], ";")
changes <- lapply(changes, FUN = "[", c(1, 3, 5, 4, 2, 6, 7)) # rearrange

changes <- sapply(changes, paste0, collapse = ";") # glue the splited text together

df$seqnames[indx] <- changes

df
                                   seqnames   Score
1 coord1;nb1;strand1;id1;rate1;X77I;bladder     1
2     coord2;nb2;strand2;id2;rate2;YH7;bone     2
3    coord3;nb3;strand3;id3;rate3;H309;Lung     3
4    coord4;nb4;strand4;id4;rate4;LÑB;brain     4
5   coord5;nb5;strand5;id5;rate5;H2020;Lung     5

0 голосов
/ 21 июня 2020

Следующий код решает проблему. Он создает индекс i с совпадениями шаблонов. Хотя я использую grepl, индекс не обязательно должен быть логическим индексом, он никогда не будет использоваться для операторов if(.). Затем он разбивает соответствующие строки на анонимные функции ';' и lapply, чтобы изменить порядок каждого из этих векторов.

i <- grepl("H309|H2020", df$seqnames)

inx_order <- c(1, 3, 5, 4, 2, 6)

a <- stringr::str_split(df$seqnames[i], ";")
df$seqnames[i] <- lapply(a, function(x){
  x <- paste(x[inx_order], collapse = ';')
  paste(x, 'Lung', sep = ';')
})

df
#                                   seqnames Score
#1 coord1;nb1;strand1;id1;rate1;X77I;bladder     1
#2     coord2;nb2;strand2;id2;rate2;YH7;bone     2
#3    coord3;nb3;strand3;id3;rate3;H309;Lung     3
#4    coord4;nb4;strand4;id4;rate4;LÑB;brain     4
#5   coord5;nb5;strand5;id5;rate5;H2020;Lung     5

Data

df <- read.table(text = "
seqnames                                          Score
coord1;nb1;strand1;id1;rate1;X77I;bladder           1
coord2;nb2;strand2;id2;rate2;YH7;bone               2
coord3;rate3;nb3;id3;strand3;H309                   3
coord4;nb4;strand4;id4;rate4;LÑB;brain              4
coord5;rate5;nb5;id5;strand5;H2020                  5
", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...