首页 > 解决方案 > 使用 if 语句但条件长度大于 1 的连续行之间的差异

问题描述

我见过与我类似的问题,但在这种特定情况下找不到解决方法。

当另一列中的值为负时,我正在尝试计算两个连续行的值之间的差异。如果没有,我想从另一列复制值。

    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
   }

对此的任何帮助将不胜感激。谢谢!

标签: rif-statement

解决方案


这是一个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

推荐阅读