R 使用if语句但条件具有长度的连续行之间的差异>;1.

R 使用if语句但条件具有长度的连续行之间的差异>;1.,r,if-statement,R,If Statement,我见过类似的问题,但在这个具体案例中找不到解决方法 当另一列中的值为负值时,我试图计算两个连续行中的值之间的差值。如果不是,我想从另一列复制该值 symbol Strt End len Overlap 121 TPTE2P4 26508213 26579690 1605 153795 46 CYCSP49 26549425 26549743 319 -30265 116 SLC25A15

我见过类似的问题,但在这个具体案例中找不到解决方法

当另一列中的值为负值时,我试图计算两个连续行中的值之间的差值。如果不是,我想从另一列复制该值

    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\u no\u 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\u no\u 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
   }
if(DPM_356_out_High_loss$重叠<0){

DPM_356_out_High_loss$len_no_overlap这可以在没有循环的情况下完成,只需完全矢量化代码

  • 首先,通过将整个旧列指定给新列来创建新列,而不关心
    中的值是否重叠
  • 然后在
    重叠
    中获得负值的索引
  • 最后,计算一条指令中的差异
  • 代码如下所示

    DPM_356_out_High_loss$len_no_overlap <- DPM_356_out_High_loss$len
    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           1605
    #46     CYCSP49 26549425 26549743  319  -30265          41530
    #116 SLC25A15P1 26586642 26591601  342   36899            342
    #84     PARP4P1 26594851 26634652 2337    3250           2337
    

    DPM_356_out_High_loss$len_no_overlap这可以在没有循环的情况下完成,只需完全矢量化代码即可

  • 首先,通过将整个旧列指定给新列来创建新列,而不关心
    中的值是否重叠
  • 然后在
    重叠
    中获得负值的索引
  • 最后,计算一条指令中的差异
  • 代码如下所示

    DPM_356_out_High_loss$len_no_overlap <- DPM_356_out_High_loss$len
    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           1605
    #46     CYCSP49 26549425 26549743  319  -30265          41530
    #116 SLC25A15P1 26586642 26591601  342   36899            342
    #84     PARP4P1 26594851 26634652 2337    3250           2337
    

    DPM_356_out_High_loss$len_no_overlap这里是一个
    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
    

    DPM\u 356\u out\u High\u loss%>%突变(无重叠\u len=if\u else(重叠这里有一个
    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
    

    DPM\u 356\u out\u High\u loss%>%变异(无重叠\u len=if\u else)(重叠如果这个答案适合你,请接受它。如果这个答案适合你,请接受它。