我想在 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/