gpt4 book ai didi

r - 基于 data.table 的动态子组的计算

转载 作者:行者123 更新时间:2023-12-04 12:27:27 26 4
gpt4 key购买 nike

我的问题与Subset by group with data.table有关但不同。

想象一个这样的数据集:

tmp <- data.table(x = 1:10, y = c(27, 70, 54, 18, 50, 44, 22, 73, 6, 5))

对于每一行数据,我想计算一个新值z,即 min(y)对于所有具有较大 x 值的行。例如,对于 x 为 3 的数据的第三行,我想要 min(y)在 x > 3 的行中(这将是值 5)。出于我们的意图和目的,您可以假设数据已按 x 排序。

起初我想到使用这样的函数:
min.y <- function(val, dt) {
dt[x > val, min(y)]
}

但是打电话 tmp[, z:= fun(x, tmp)]将导致警告消息:
In min(y) : no non-missing arguments to min; returning Inf

这样做的正确方法是什么?

PS:显然,对于最后一行,我希望得到 NA 作为结果

最佳答案

方法一:

既然你说我们可以假设数据是按 x 排序的您可以使用从 y 结束开始的累积最小值.我们删除了第一个观察结果,以便我们做 >搜索而不是 >= :

tmp$min_y <- c(rev(cummin(rev(tmp$y[-1]))), NA)

更新:旧方法有效地做了一个 >=搜索而不是 > .更新做 > .

方法二:数据表

如果您想使用 data.table您可以尝试按每一行分组,然后在 J 内设置子集.需要 ifelse 以便当我们处于最后一行时,我们不会取任何值的最小值:
tmp[, "min_y" := {curr_x <- x
tmp_subs <- tmp[x > curr_x]
ifelse(nrow(tmp_subs)>0, min(tmp[x > curr_x][["y"]]), NA_real_)},
by = 1:nrow(tmp)]

tmp
# x y min_y
# 1: 1 27 5
# 2: 2 70 5
# 3: 3 54 5
# 4: 4 18 5
# 5: 5 50 5
# 6: 6 44 5
# 7: 7 22 5
# 8: 8 73 5
# 9: 9 6 5
#10: 10 5 NA

5是最小值,最后一切都将是 5 .让我们让这更有趣一点:
tmp <- data.table(x = 1:10, y = c(27, 70, 54, 18, 50, 44, 22, 73, 47, 58))

我们的结果将是:
#     x  y min_y
# 1: 1 27 18
# 2: 2 70 18
# 3: 3 54 18
# 4: 4 18 22
# 5: 5 50 22
# 6: 6 44 22
# 7: 7 22 47
# 8: 8 73 47
# 9: 9 47 58
#10: 10 58 NA

关于r - 基于 data.table 的动态子组的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53658237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com