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

标签 r data.table

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

相关文章:

r - 使用列作为参数在 data.table 中按行应用函数

r - As.character 返回数字而不是字符串 R

r - 使用 RSelenium 跨 Windows 和 Mac 进行网页抓取

r - 为大型数据集加速 plot() 函数

r - 在 "by-argument"data.table 中使用 "outer"过滤 "inner"data.table

r - 数据表错误 "maxn (N) is not exact multiple of this j column' s长度(J)"

R中的行式矩阵运算

r - 使 sf 包中的 st_make_valid 工作(Windows)

r - 保存绘图而不显示它

r-markdown:德语引号将 HTML 文档中的粗体文本分隔开