【发布时间】:2021-07-17 07:07:40
【问题描述】:
我这几天一直在寻找这个问题的答案。我想我已经很接近了,但我不知道该怎么做。
我有一个包含两列的 data.table:
df = data.table(a = c(8,3,6,12,15,21,4,5,1,32,13), b = c(12,3,1,66,4,7,32,6,76,2,11))
我想在滚动的四天窗口中获取最小的两个值及其索引。 Rfast::nth 似乎给了我我需要的一切,除了我不能矢量化它。显然我做错了什么。
我需要输出如下所示:
a b low lowIdx low2 low2Idx
1: 8 12 NA NA NA NA
2: 3 3 NA NA NA NA
3: 6 1 NA NA NA NA
4: 12 66 3 2 6 3
5: 15 4 3 1 6 2
6: 21 7 6 1 12 2
7: 4 32 4 4 12 1
8: 5 6 4 3 4 3
9: 1 76 1 4 4 2
10: 32 2 1 3 4 1
11: 13 11 1 2 5 1
我已经尝试过以下不同形式:
n <- nrow(df)
df$low[4:n] <- Rfast::nth(df[(n-3):n]$a, 1)
df$lowIdx[4:n] <- Rfast::nth(df$a, 1, index.return = TRUE)
df$low2[4:n] <- Rfast::nth(df[(n-3):n]$a, 2)
df$low2Idx[4:n] <- Rfast::nth(df$a, 2, index.return = TRUE)
我也一直在尝试使用 frollapply,但无济于事。
谢谢你,皮特
【问题讨论】:
-
low2和low2Idx是第二低的值和索引,对吧?为什么它们在第 8 行的值是一样的? -
Ronak,是的,没错,low2 和 low2Idx 是第二低的值和索引。谢谢大家的帮助!
-
另外,这最终将针对 1100 万条记录的多个列。我会做一些计时并报告什么是最快的。再次感谢大家的帮助。
-
Rfast也有colnth这就是你想要的。
标签: r data.table vectorization rolling-computation