簡體   English   中英

R:使用相同的標識符計算數據幀中元素之間的偏移差異

[英]R: Calculating offset differences between elements in data frame with the same identifier

以下是我的數據的子集:

> 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))

我想計算另一個值:第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

我想這樣做的原因是我正在尋找積極的dist值。 我試過這種方法的一種方法是偏移開始和結束坐標,但后來我遇到了一個問題,即我用不同的名字比較事物。

如何在R中做到這一點?

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

假設您的數據已排序,您也可以使用基本R函數執行此操作:

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

使用dplyr(信用@thelatemail計算dist):

library(dplyr)

dat.new <- dt %.%
  group_by(name) %.%
  mutate(dist = c(NA, end[-(length(end))] - start[-1]))

這是一個不同的dplyr解決方案:

dt %.% group_by(name) %.% mutate(dist = lag(end) - start)

贈送:

Source: local data frame [6 x 4]
Groups: name

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM