嵌套的用户定义函数使用R中的apply

时间:2018-10-30 08:31:48

标签: r for-loop apply lapply sapply

如何使用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
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我会改用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']]

这实际上切换为tidy data格式,这是一种存储多维数据的简便方法。

要获得更轻松的语法和更快的速度,可以使用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]