计算不同行和不同列中的值之间的差异

calculate difference between values in different row and different column

我有一个这样的数据框:

ID  s1  e1  s2  e2
A   50  150 80  180
A   160 350 280 470
A   355 700 800 1150
B   100 500 150 550
B   550 1500    800 1750

当 ID 相同时,我想计算连续行中不同列中的值之间的差异(对于 ID A:第 2 行中的 s1 减去第 1 行中的 e1;第 3 行中的 s1 减去第 2 行中的 e1;第 2 行中的 s2 减去e2 in row1; s2 in row3 minus e2 in row2) 并将这些值添加到新列(diff1 和 diff2)。

数据框将如下所示:

ID  s1  e1  s2  e2  diff1   diff2
A   50  150 80  180     
A   160 350 280 470 10  100
A   355 700 800 1150    5   330
B   100 500 150 550     
B   550 1500    800 1750    50  250

这可能吗?

提前致谢

WD

按[=22=分组后,得到's1'的lead,从'e1'中减去它,创建'diff1'作为lag 这个输出。类似地,'diff2' 可以创建相应的 's2' 和 'e2' 列对

library(dplyr)
df1 %>%
    group_by(ID) %>%
    mutate(diff1 = lag(lead(s1) - e1), diff2 = lag(lead(s2)- e2))
# A tibble: 5 x 7
# Groups: ID [2]
#   ID       s1    e1    s2    e2 diff1 diff2
#   <chr> <int> <int> <int> <int> <int> <int>
#1 A        50   150    80   180    NA    NA
#2 A       160   350   280   470    10   100
#3 A       355   700   800  1150     5   330
#4 B       100   500   150   550    NA    NA
#5 B       550  1500   800  1750    50   250

如果有多个 's'、'e' 对,data.table 的一个选项是 melt 将其转换为 'long' 格式,然后 dcast 到 'wide' 经过必要的计算

library(data.table)
dnew <- dcast(melt(setDT(df1, keep.rownames = TRUE),
 measure = patterns("^s\d+", "^e\d+"), value.name = c("s", "e"))[, 
  diffs := shift(shift(s, type = "lead") - e), .(ID, variable)][],
           rn + ID ~ paste0('diff', variable), value.var = 'diffs')
df1[, names(dnew)[3:4] := dnew[, 3:4, with = FALSE]][, rn := NULL][]
#   ID  s1   e1  s2   e2 diff1 diff2
#1:  A  50  150  80  180    NA    NA
#2:  A 160  350 280  470    10   100
#3:  A 355  700 800 1150     5   330
#4:  B 100  500 150  550    NA    NA
#5:  B 550 1500 800 1750    50   250