gpt4 book ai didi

R data.table 计数行直到达到值

转载 作者:行者123 更新时间:2023-12-04 10:29:46 24 4
gpt4 key购买 nike

我想在 data.table 中返回一个新列,该列显示向下的行数,直到达到低于当前值(Temp)的值。

library(data.table)
set.seed(123)
DT <- data.table( Temp = runif(10,0,20) )

这是我希望它的外观:
set.seed(123)
DT <- data.table(
Temp = runif(10,0,20),
Day_Below_Temp = c("5","1","3","2","1","NA","3","1","1","NA")
)

最佳答案

使用当前开发版本中新实现的非对等连接,可以通过如下简单的方式完成:

require(data.table) # v1.9.7+
DT[, row := .I] # add row numbers
DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first"]
# [1] 5 1 3 2 1 NA 3 1 1 NA

行号是必要的,因为我们需要找到低于当前索引的索引,因此需要作为连接中的条件。我们执行自连接,即对于 DT 中的每一行(内部),基于提供给 on 的条件参数,我们在 DT 中找到第一个匹配的行索引(外)。然后我们减去行索引以获得当前行的位置。 x.row指外 DT的索引和 i.row到内部 DT .

要获取开发版本,请参阅安装说明 here .

在 1e5 行上:
set.seed(123)
DT <- data.table(Temp = runif(1e5L, 0L, 20L))

DT[, row := .I]
system.time({
ans = DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first", verbose=TRUE]
})
# Non-equi join operators detected ...
# forder took ... 0.001 secs
# Generating non-equi group ids ... done in 0.452 secs
# Recomputing forder with non-equi ids ... done in 0.001 secs
# Found 623 non-equi group(s) ...
# Starting bmerge ...done in 8.118 secs
# Detected that j uses these columns: x.row,i.row
# user system elapsed
# 8.492 0.038 8.577

head(ans)
# [1] 5 1 3 2 1 12
tail(ans)
# [1] 2 1 1 2 1 NA

关于R data.table 计数行直到达到值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905020/

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