在 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))
}
}
我的模型有很多这种嵌套的for循环结构,因为我无能。我希望使用 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']]
这实际上是切换到 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]
下面的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))
}
}
我的模型有很多这种嵌套的for循环结构,因为我无能。我希望使用 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']]
这实际上是切换到 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]