Разница между последовательными строками, использующими оператор if, но условие имеет длину> 1 - PullRequest
0 голосов
/ 14 января 2020

Я видел подобные вопросы с моим, но не смог найти способ их решения в данном конкретном случае c.

Я пытаюсь сделать разницу между значениями из двух последовательных строк, когда значение в другой столбец отрицательный. Если нет, я хочу скопировать значение из другого столбца.

    symbol      Strt        End         len    Overlap
121 TPTE2P4     26508213    26579690    1605    153795
46  CYCSP49     26549425    26549743    319     -30265
116 SLC25A15P1  26586642    26591601    342      36899
84  PARP4P1     26594851    26634652    2337      3250

Итак, с приведенной выше датой я пытаюсь сделать разницу между значениями из двух последовательных строк (Конец текущей строки - Начало из предыдущей строки), когда значение в столбце Overlap является отрицательным. Если нет, я хочу скопировать значение из len. Я должен ожидать эти результаты в столбце len_no_overlap:

    symbol      Strt        End         len    Overlap  len_no_overlap
121 TPTE2P4     26508213    26579690    1605    153795       1605
46  CYCSP49     26549425    26549743     319    -30265    **41530**
116 SLC25A15P1  26586642    26591601     342     36899        342
84  PARP4P1     26594851    26634652    2337      3250       2337

Так что в этом случае, только во втором ряду Overlap является отрицательным, а значение len_no_overlap получается из 26549743-26508213.

Я написал код следующим образом, но не могу векторизовать его, чтобы он работал

if (DPM_356_out_High_loss$Overlap < 0) {
   DPM_356_out_High_loss$len_no_overlap <- c(NA, tail(DPM_356_out_High_loss$End, -1)      head(DPM_356_out_High_loss$Strt, -1))
   } else {
       DPM_356_out_High_loss$len_no_overlap <- DPM_356_out_High_loss$len
   }

Любая помощь с этим была бы очень признательна. Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Вот решение tidyverse:

DPM_356_out_High_loss %>% mutate(no_overlap_len = if_else(Overlap<0, End-lag(Strt), len))
# A tibble: 4 x 6
  symbol         Strt      End   len Overlap no_overlap_len
  <chr>         <dbl>    <dbl> <dbl>   <dbl>          <dbl>
1 TPTE2P4    26508213 26579690  1605  153795           1605
2 CYCSP49    26549425 26549743   319  -30265          41530
3 SLC25A15P1 26586642 26591601   342   36899            342
4 PARP4P1    26594851 26634652  2337    3250           2337
0 голосов
/ 14 января 2020

Это можно сделать без циклов, просто полностью векторизованный код.

  1. Сначала создайте новый столбец, назначив ему весь старый столбец, не заботясь о том, являются ли значения в Overlap отрицательными.
  2. Затем получите индексы с отрицательными значениями в Overlap.
  3. Наконец, вычислите различия в одной инструкции.

Код становится следующим:

DPM_356_out_High_loss$len_no_overlap <- DPM_356_out_High_loss$Overlap
inx <- which(DPM_356_out_High_loss$Overlap < 0)

DPM_356_out_High_loss$len_no_overlap[inx] <- DPM_356_out_High_loss$End[inx] - DPM_356_out_High_loss$Strt[inx - 1]

DPM_356_out_High_loss
#        symbol     Strt      End  len Overlap len_no_overlap
#121    TPTE2P4 26508213 26579690 1605  153795         153795
#46     CYCSP49 26549425 26549743  319  -30265          41530
#116 SLC25A15P1 26586642 26591601  342   36899          36899
#84     PARP4P1 26594851 26634652 2337    3250           3250

Данные.

DPM_356_out_High_loss <- read.table(text = "
    symbol  Strt    End len Overlap
121 TPTE2P4 26508213    26579690    1605    153795
46  CYCSP49 26549425    26549743    319 -30265
116 SLC25A15P1  26586642    26591601    342 36899
84  PARP4P1 26594851    26634652    2337    3250
", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...