计算不同行和不同列中的值之间的差异
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
我有一个这样的数据框:
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