gpt4 book ai didi

r - 使用 data.table R 在滚动基础(重置和恢复)中提取累积唯一值

转载 作者:行者123 更新时间:2023-12-03 21:41:19 25 4
gpt4 key购买 nike

给定一个 data.table,我想提取累积的唯一元素,直到它达到三个唯一值,然后重置和恢复:

y <- data.table(a=c(1, 2, 2, 3, 3, 4, 3, 2, 2, 5, 6, 7, 9, 8))
所需的输出 unique_acc_roll_3 是:
a   unique_acc_roll_3
1 1
2 1 2
2 1 2
3 1 2 3
3 1 2 3
4 4 #4 is the forth element, so it resets and start again
3 3 4
2 2 3 4
2 2 3 4
5 5 #5 is the forth element, so it resets and start again
6 5 6
7 5 6 7
9 9 #9 is the forth element, so it resets and start again
8 8 9
因为它递归地引用,我真的被卡住了......真实数据很大,所以 data.table 解决方案会很棒。

最佳答案

我想不出任何方法来避免 for本质上是循环,除了将它隐藏在 Reduce 后面称呼。我的逻辑是保持union - 在每一行输入每个新值,直到集合增长到 length == n ,此时新值用作循环下一次迭代的起点。

unionlim <- function(x, y, n=4) {
u <- union(x,y)
if(length(u) == n) y else u
}

y[, out := sapply(Reduce(unionlim, a, accumulate=TRUE), paste, collapse=" ")]

# a out
# 1: 1 1
# 2: 2 1 2
# 3: 2 1 2
# 4: 3 1 2 3
# 5: 3 1 2 3
# 6: 4 4
# 7: 3 4 3
# 8: 2 4 3 2
# 9: 2 4 3 2
#10: 5 5
#11: 6 5 6
#12: 7 5 6 7
#13: 9 9
#14: 8 9 8
这远不是这个星球上最快的代码,但快速测试表明它在我体面的机器上大约 15 秒内会处理大约 100 万个案例。
bigy <- y[rep(1:nrow(y), 75e3)]
system.time({
bigy[, out := sapply(Reduce(unionlim, a, accumulate=TRUE), paste, collapse=" ")]
})
# user system elapsed
# 14.27 0.09 15.06

关于r - 使用 data.table R 在滚动基础(重置和恢复)中提取累积唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67426753/

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