我是編程新手并陷入其中。我想使用一些變數來計算一個物體全年每小時的溫度變化,這些變數每小時都在變化。原始資料包含 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 專案,非常感謝任何幫助。謝謝你。
uj5u.com熱心網友回復:
使用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
uj5u.com熱心網友回復:
您可以嘗試Reduce如下
dt[
,
A := Reduce(function(x, Y) (x Y[2]) * Y[1],
asplit(embed(B, 2), 1),
init = A[1],
accumulate = TRUE
)
][
,
C := A * B
]
更新dt為
> dt
A B C
1: 1 1 1
2: 4 2 8
3: 18 3 54
4: 84 4 336
5: 440 5 2200
資料
dt <- data.table("A" = c(1), "B" = c(1:5), "C" = c(10))
uj5u.com熱心網友回復:
這是一個解決方案,使用purrr::accumulate2它可以讓您使用前一個計算的結果作為下一個計算的輸入:
library(data.table)
library(purrr)
library(magrittr)
table <- data.table("A" = c(1), "B" = c(1:5), "C" = c(10))
table$A <- accumulate2(
table$A,
seq(table$A),
~ (..1 table$B[..3]) * table$B[..3 1],
.init = table$A[1]
) %>%
unlist() %>%
extract(1:nrow(table))
table$C <- table$B * table$A
table
# A B C
# 1: 1 1 1
# 2: 4 2 8
# 3: 18 3 54
# 4: 84 4 336
# 5: 440 5 2200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532039.html
