簡體   English   中英

嵌套的用戶定義函數使用R中的apply

[英]Nested user defined functions using apply in R

以下內容將如何使用apply編寫?

# Variables
age <- 1:100
Y   <- age+5
d   <- 0.25
dx  <- 5
a_x <- 1:dx
Yd  <- matrix( 0, nrow=max(age), ncol=dx )

# Nested loop is computationally inefficient?
for (a in age){
  for (ax in a_x){
    Yd[a,ax] <- (Y[[a]] * (1 - d) ** (ax-1))
  }
}

我的模型中有很多嵌套在循環結構中的,因為我不稱職。 我希望使用apply來縮短計算時間。 我發現應用功能相當混亂。 我正在尋找一種解決方案,以說明如何使用apply獲得嵌套結構。 希望從那里開始,我可以將解決方案應用於(甚至是雙關語)更復雜的嵌套for循環(彼此之間有4-5個循環)。

例如

Ydi <- rep( list(), 6)

for (i in 1:6){
  Ydi[[i]] <- matrix( 0, nrow=max(age), ncol=dx )
}

# Nested loop is computationally inefficient?
for (i in 1:6){
  for (a in age){
    for (ax in a_x){
      Ydi[[i]][a,ax] <- (Y[[a]] * (1 - d) ** (ax-1)) + i
    }
  }
}

我將使用expand.grid代替:

df <- data.frame(expand.grid(a = age, ax = a_x))
df[['Yd']] <- (df[['a']] + 5) * (1 - d) ** (df[['ax']] - 1)

這是無限擴展的(受內存限制)-每個附加的嵌套循環將只是您expand.grid調用中的附加變量。 例如:

new_col <- 1:2
df_2 <- data.frame(expand.grid(a = age, ax = a_x, nc = new_col))
df_2[['Yd']] <- (df_2[['a']] + 5) * (1 - d) ** (df_2[['ax']] - 1) + df_2[['nc']]

這實際上轉換為整齊的數據格式,這是一種存儲多維數據的簡便方法。

為了data.table語法並提高速度,可以使用data.table包:

library(data.table)
dt_3 <- data.table(expand.grid(a = age, ax = a_x, nc = new_col))
dt_3[ , Yd := (a + 5) * (1 - d) ** (ax - 1) + nc]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM