【问题标题】:How to fill multiple arrays in R with one loop如何用一个循环填充R中的多个数组
【发布时间】:2022-01-23 20:38:11
【问题描述】:

我有许多数组要填充 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)))

【问题讨论】:

  • 它们必须是单独的变量吗?通常使用单个 list() 并让每个变量成为一个列表元素会容易得多。

标签: r arrays eval


【解决方案1】:

你很亲密,特别是因为你已经知道assign。除了assign,诀窍是将get 向量和concatenate 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

【讨论】:

  • 太好了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多