首页 > 解决方案 > 在循环中填充空向量

问题描述

我创建了四个空向量 ( series_p_river),我想将它们填充一个循环而不是一个一个地填充。应该填充到向量中的数据包含四个不同河流流域(Main、Danube、Isar 和 Inn)的平均值,每条河流和每个时间步长都有一个值。例如Main.4_mean, Danube.18_mean, Isar.2_mean, Inn.8_mean. 时间步数ntime是空向量的长度。

一对一的方法当然效果很好,但不是很优雅:

for (j in 1:ntime) {
  series_p_Main[j] <- get(paste0("Main.", j, "_mean"))
  series_p_Danube[j] <- get(paste0("Danube.", j, "_mean"))
  series_p_Isar[j] <- get(paste0("Isar.", j, "_mean"))
  series_p_Inn[j] <- get(paste0("Inn.", j, "_mean"))
}

有没有办法以循环或其他方式实现这一目标?

标签: r

解决方案


看来您将对每条河流都做类似的事情,因此我通常建议您使用矢量列表而不是环境中的单个对象。这表明series_p_Main您可能需要参考series_p[["Main"]]. 但是,使用列表的额外好处是,当您对每个向量执行相同操作时,您可以使用lapply而不是手动执行每个向量。

例如,

ntime <- 3
series_p <- lapply(setNames(nm = c("Main", "Danube", "Isar", "Inn")),
                   function(nm) sprintf("%s.%s_mean", nm, seq_len(ntime)))
str(series_p)
# List of 4
#  $ Main  : chr [1:3] "Main.1_mean" "Main.2_mean" "Main.3_mean"
#  $ Danube: chr [1:3] "Danube.1_mean" "Danube.2_mean" "Danube.3_mean"
#  $ Isar  : chr [1:3] "Isar.1_mean" "Isar.2_mean" "Isar.3_mean"
#  $ Inn   : chr [1:3] "Inn.1_mean" "Inn.2_mean" "Inn.3_mean"
series_p[["Main"]]
# [1] "Main.1_mean" "Main.2_mean" "Main.3_mean"

或者如果ntime实际上是一个向量,则删除seq_len

ntime <- c(4, 8, 12)
series_p <- lapply(setNames(nm = c("Main", "Danube", "Isar", "Inn")), function(nm) sprintf("%s.%s_mean", nm, ntime))
series_p[["Main"]]
# [1] "Main.4_mean"  "Main.8_mean"  "Main.12_mean"

推荐阅读