gpt4 book ai didi

r - 如何有效地确定每行中的变量值与R中data.table中相同变量后续行值之间的最大差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:59 24 4
gpt4 key购买 nike

在 R 中的 data.table 中确定每行的值 (X) 与组 (Y) 内同一变量 (X) 的后续值之间的最大正差的最有效方法是什么。

例子:

set.seed(1)
dt <- data.table(X = sample(100:200, 500455, replace = TRUE),
Y = unlist(sapply(10:1000, function(x) rep(x, x))))

这是我认为无效且缓慢的解决方案:

dt[, max_diff := vapply(1:.N, function(x) max(X[x:.N] - X[x]), numeric(1)), by = Y]
head(dt, 21)

X Y max_diff
1: 126 10 69
2: 137 10 58
3: 157 10 38
4: 191 10 4
5: 120 10 75
6: 190 10 5
7: 195 10 0
8: 166 10 0
9: 163 10 0
10: 106 10 0
11: 120 11 80
12: 117 11 83
13: 169 11 31
14: 138 11 62
15: 177 11 23
16: 150 11 50
17: 172 11 28
18: 200 11 0
19: 138 11 56
20: 178 11 16
21: 194 11 0

是否可以建议有效(更快)的解决方案?

最佳答案

这是一个 dplyr 解决方案,它的速度提高了大约 20 倍,并且得到了相同的结果。我认为等效的 data.table 会更快。 (编辑:见底部 - 是!)

加速来自减少需要执行的比较次数。最大的差异总是会在组中最大的剩余数字中找到,因此首先识别该数字并且每行只做一个减法会更快。

首先,原始解决方案在我的机器上大约需要 4 秒:

tictoc::tic("OP data.table") 
dt[, max_diff := vapply(1:.N, function(x) max(X[x:.N] - X[x]), numeric(1)), by = Y]
tictoc::toc()
# OP data.table: 4.594 sec elapsed

但仅需 0.2 秒,我们就可以获取该 data.table,转换为数据框,添加 orig_row 行号,按 Y 分组,按 orig_row 反向排序,取X与X的累积最大值之差,解码,按原顺序重新排列:

library(dplyr)
tictoc::tic("dplyr")
dt2 <- dt %>%
as_data_frame() %>%
mutate(orig_row = row_number()) %>%

group_by(Y) %>%
arrange(-orig_row) %>%
mutate(max_diff2 = cummax(X) - X) %>%
ungroup() %>%
arrange(orig_row)
tictoc::toc()
# dplyr: 0.166 sec elapsed

all.equal(dt2$max_diff, dt2$max_diff2)
#[1] TRUE

编辑:正如@david-arenburg 在评论中所建议的那样,这可以在 data.table 中用优雅的线条快速完成:

dt[.N:1, max_diff2 := cummax(X) - X, by = Y]

在我的电脑上,这比上面的 dplyr 解决方案快 2-4 倍。

关于r - 如何有效地确定每行中的变量值与R中data.table中相同变量后续行值之间的最大差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271820/

24 4 0