gpt4 book ai didi

r - 如何使用函数在data.table/R 中进行递归计算?

转载 作者:行者123 更新时间:2023-12-05 01:22:11 26 4
gpt4 key购买 nike

我是编程的新手,并且陷入其中。我想使用一些每小时变化的变量来计算一个物体全年每小时的温度变化。原始数据包含60列和8760行用于计算。

我使用 for 循环获得了所需的输出,但该模型需要花费大量时间进行计算。我想知道是否有任何方法可以用函数代替循环,我怀疑这也可以提高计算速度。

这是一个可重现的小例子来展示我所做的。

table <- data.table("A" = c(1), "B" = c(1:5), "C" = c(10))

table
   A B  C
1: 1 1 10
2: 1 2 10
3: 1 3 10
4: 1 4 10
5: 1 5 10

for循环

for (j in (2: nrow(table))) {
table$A[j] = (table$A[j-1] + table$B[j-1]) * table$B[j]
table$C[j] = table$B[j] * table$A[j]
}

我得到了我想要的输出:

     A B    C
1: 1 1 10
2: 4 2 8
3: 18 3 54
4: 84 4 336
5: 440 5 2200

但在我的案例中运行整个程序需要 15 分钟(不是这个!)

所以我尝试使用函数而不是 for 循环。

我试过这个:

table <- data.table("A" = c(1), "B" = c(1:5), "C" = c(10))


myfun <- function(df){
df = df %>% mutate(A = (lag(A) + lag(B)) * B,
C = B * A)
return(df)
}

myfun(table)

但是输出是

   A B   C
1 NA 1 NA
2 4 2 8
3 9 3 27
4 16 4 64
5 25 5 125

因为看起来该函数引用的是第一个表的行,而不是计算后更新的行。有什么方法可以使用函数获得所需的输出吗?这是我的第一个 R 项目,非常感谢任何帮助。谢谢。

最佳答案

使用 data.table 的更快替代方案。请注意,C 的计算可以与 A 的计算分开,因此我们可以在循环中做更少的事情:

for (i in 2:nrow(table)) {
set(table, i = i, j = "A", value = with(table, (A[i-1] + B[i-1]) * B[i]))
}
table[-1, C := A * B]
table

# A B C
# <num> <int> <num>
# 1: 1 1 10
# 2: 4 2 8
# 3: 18 3 54
# 4: 84 4 336
# 5: 440 5 2200

关于r - 如何使用函数在data.table/R 中进行递归计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74402236/

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