我有一个这样的数据框:
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减去第2行中的e2) row1; row3中的s2减去row2中的e2)并将这些值添加到新列(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
答案 0 :(得分:2)
按ID'分组后,获取' 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
如果有多个&#39;,&#39; e&#39;成对,data.table
的一个选项是melt
它长到&#39;格式,然后dcast
到&#39;宽&#39;在做了必要的计算之后
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