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)(重叠如果这个答案适合你,请接受它。如果这个答案适合你,请接受它。