R:使用相同的标识符计算数据帧中元素之间的偏移差异

ree*_*dms 5 r dataframe

以下是我的数据的子集:

> head(dt)

   name    start     end
1:    1  3195984 3197398
2:    1  3203519 3205713
3:    2  3204562 3207049
4:    2  3411782 3411982 
5:    2  3660632 3661579
6:    3  3638391 3640590

dt <- data.frame(name = c(1, 1, 2, 2, 2, 3), start = c(3195984, 
3203519, 3204562, 3411782, 3660632, 3638391), end = c(3197398, 
3205713, 3207049, 3411982, 3661579, 3640590))
Run Code Online (Sandbox Code Playgroud)

我想计算另一个值:第n行的结束坐标与第n + 1行的起始坐标之间的差异,但仅当两个元素共享一个名称时.详细说明这就是我希望结果数据框看起来像:

   name    start     end    dist
1:    1  3195984 3197398
2:    1  3203519 3205713   -6121
3:    2  3204562 3207049
4:    2  3411782 3411982 ?204733
5:    2  3660632 3661579 ?248650
6:    3  3638391 3640590
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我正在寻找积极的dist值.我试过这种方法的一种方法是偏移开始和结束坐标,但后来我遇到了一个问题,即我用不同的名字比较事物.

如何在R中做到这一点?

the*_*ail 5

一个data.table解决方案可能是很好的位置:

library(data.table)
dt <- as.data.table(dt)
dt[, dist := c(NA, end[-(length(end))] - start[-1]) , by=name]
dt

#   name   start     end    dist
#1:    1 3195984 3197398      NA
#2:    1 3203519 3205713   -6121
#3:    2 3204562 3207049      NA
#4:    2 3411782 3411982 -204733
#5:    2 3660632 3661579 -248650
#6:    3 3638391 3640590      NA
Run Code Online (Sandbox Code Playgroud)

假设您的数据已排序,您也可以使用基本R函数执行此操作:

dt$dist <- unlist(
  by(dt, dt$name, function(x) c(NA, x$end[-(length(x$end))] - x$start[-1]) )
)
Run Code Online (Sandbox Code Playgroud)