如何用一个循环填充R中的多个数组
How to fill multiple arrays in R with one loop
我有很多数组要填入R,每个数组在特定模式下都有不同的名称。我遇到的问题是我无法弄清楚如何将数组名称引用为变量,因此我可以在循环内以系统的方式引用它们。例如,它们是使用此循环创建的。
for (i in c(40,45,50,55,57,60,65)){
assign(paste0('hdd_',as.character(i),'_365_z'), rep(NA,365))}
我想填充这些数组中的每一个,它们现在被命名为:hdd_40_365_z、hdd_45_365_z,等等
假设我想使用像这样的简单函数来填充这些数组中的每一个:
my_func <- function(value,doy){
return(value * doy/2)} # doy = doy or 1:365
我可以写一个循环来做到这一点:
for (j in c(40,45,50,55,57,60,65)){
for (k in 1:365){
# try to fill arrays one day at a time
paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)}}
显然,这是行不通的。我尝试使用以下方法来执行此操作,但它不起作用。必须有一种方法可以做这样的事情,我想,但我想不出 eval、parse、as.name 或其他方法的组合来做到这一点。任何帮助都会很棒。谢谢。
eval(parse(text = paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)))
你很接近,尤其是因为你已经知道 assign
。除了 assign
,诀窍是 get
向量和 c
将 my_func
的结果连接到现有向量。
我们使用 NULL
而不是 NA
、
来初始化对象
for (i in c(40, 45, 50, 55, 57, 60, 65)) {
assign(paste0('hdd_', as.character(i), '_365_z'), NULL)
}
和c
每个结果。
for (j in c(40, 45, 50, 55, 57, 60, 65)) {
for (k in 1:365) {
# try to fill arrays one day at a time
x <- paste0('hdd_', as.character(j), '_365_z')
assign(x, c(get(x), my_func(j, k)))
}
}
给出:
lapply(mget(ls(pattern='hdd')), head)
# $hdd_40_365_z
# [1] 20 40 60 80 100 120
#
# $hdd_45_365_z
# [1] 22.5 45.0 67.5 90.0 112.5 135.0
#
# $hdd_50_365_z
# [1] 25 50 75 100 125 150
#
# $hdd_55_365_z
# [1] 27.5 55.0 82.5 110.0 137.5 165.0
#
# $hdd_57_365_z
# [1] 28.5 57.0 85.5 114.0 142.5 171.0
#
# $hdd_60_365_z
# [1] 30 60 90 120 150 180
#
# $hdd_65_365_z
# [1] 32.5 65.0 97.5 130.0 162.5 195.0
我有很多数组要填入R,每个数组在特定模式下都有不同的名称。我遇到的问题是我无法弄清楚如何将数组名称引用为变量,因此我可以在循环内以系统的方式引用它们。例如,它们是使用此循环创建的。
for (i in c(40,45,50,55,57,60,65)){
assign(paste0('hdd_',as.character(i),'_365_z'), rep(NA,365))}
我想填充这些数组中的每一个,它们现在被命名为:hdd_40_365_z、hdd_45_365_z,等等
假设我想使用像这样的简单函数来填充这些数组中的每一个:
my_func <- function(value,doy){
return(value * doy/2)} # doy = doy or 1:365
我可以写一个循环来做到这一点:
for (j in c(40,45,50,55,57,60,65)){
for (k in 1:365){
# try to fill arrays one day at a time
paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)}}
显然,这是行不通的。我尝试使用以下方法来执行此操作,但它不起作用。必须有一种方法可以做这样的事情,我想,但我想不出 eval、parse、as.name 或其他方法的组合来做到这一点。任何帮助都会很棒。谢谢。
eval(parse(text = paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)))
你很接近,尤其是因为你已经知道 assign
。除了 assign
,诀窍是 get
向量和 c
将 my_func
的结果连接到现有向量。
我们使用 NULL
而不是 NA
、
for (i in c(40, 45, 50, 55, 57, 60, 65)) {
assign(paste0('hdd_', as.character(i), '_365_z'), NULL)
}
和c
每个结果。
for (j in c(40, 45, 50, 55, 57, 60, 65)) {
for (k in 1:365) {
# try to fill arrays one day at a time
x <- paste0('hdd_', as.character(j), '_365_z')
assign(x, c(get(x), my_func(j, k)))
}
}
给出:
lapply(mget(ls(pattern='hdd')), head)
# $hdd_40_365_z
# [1] 20 40 60 80 100 120
#
# $hdd_45_365_z
# [1] 22.5 45.0 67.5 90.0 112.5 135.0
#
# $hdd_50_365_z
# [1] 25 50 75 100 125 150
#
# $hdd_55_365_z
# [1] 27.5 55.0 82.5 110.0 137.5 165.0
#
# $hdd_57_365_z
# [1] 28.5 57.0 85.5 114.0 142.5 171.0
#
# $hdd_60_365_z
# [1] 30 60 90 120 150 180
#
# $hdd_65_365_z
# [1] 32.5 65.0 97.5 130.0 162.5 195.0