R 如何在多个列表上循环

R 如何在多个列表上循环,r,R,我正在研究四个流域的降水数据。这四条河流是梅因河、多瑙河、伊萨尔河和因恩河。降水数据集组织在一个数组中(维度为150 80)。第三维表示单个时间步。对于每个流域,我都有一个称为“mask_rivername”的矩阵,因此“mask_Main”、“mask_Danube”等。每个矩阵的维数150。目标是将单个矩阵与降水数据的每个时间步长相乘。 为了实现这一点,我为每条河流创建了一个名为“Main.list”、“donube.list”、“Isar.list”和“Inn.list”的列表。 现在我想

我正在研究四个流域的降水数据。这四条河流是梅因河、多瑙河、伊萨尔河和因恩河。降水数据集组织在一个数组中(维度为
150 80
)。第三维表示单个时间步。对于每个流域,我都有一个称为“mask_rivername”的矩阵,因此“mask_Main”、“mask_Danube”等。每个矩阵的维数
150
。目标是将单个矩阵与降水数据的每个时间步长相乘。 为了实现这一点,我为每条河流创建了一个名为“Main.list”、“donube.list”、“Isar.list”和“Inn.list”的列表。 现在我想填充单个列表,例如使用循环。如果我一个接一个地这样做,效果会很好:

for (i in 1:ntime) {
  Main.list[[paste0("Main.rr",i)]] <- PRECIPITATION[,,i]*mask_Main
  Danube.list[[paste0("Danube.rr",i)]] <- PRECIPITATION[,,i]*mask_Danube
  Isar.list[[paste0("Isar.rr",i)]] <- PRECIPITATION[,,i]*mask_Isar
  Inn.list[[paste0("Inn.rr",i)]] <- PRECIPITATION[,,i]*mask_Inn
}
for(i在1:ntime中){

Main.list[[paste0(“Main.rr,i)]]这个问题可以用双
lappy
循环的R方式回答。只要两个参数、沉淀数组和遮罩都在列表对象中。这就是初步代码所做的,创建两个列表

mask_list <- mget(ls(pattern = "^mask_", envir = .GlobalEnv), envir = .GlobalEnv)
nmat <- dim(PRECIPITATION)[3]
precip_list <- lapply(seq.int(nmat), function(i) PRECIPITATION[,, i])

new_precip <- lapply(mask_list, function(x, y){
  lapply(y, function(.y) .y * x)
}, y = precip_list)

rivers <- sub("^mask_", "", names(mask_list))
new_precip <- lapply(seq_along(new_precip), function(i){
  names(new_precip[[i]]) <- paste(rivers[i], seq.int(nmat), sep = ".")
  new_precip[[i]]
})
names(new_precip) <- rivers

你能发布矩阵的较小子集吗,比如说,
dput(降水量[1:10,1:10,1:4])
和至少一个
遮罩
,理想情况下,所有4个?准确的值并不那么重要。基本上,你可以使用
降水
值的任何数组和
遮罩
值的任何矩阵,只要尺寸相同。例如
遮罩
,谢谢你的回答,但不幸的是,它没有看到正如问题中所述,输出应该是四个列表,每个列表包含80个单一元素(由
mask_river
乘以降水数据的时间步数(80))。当我应用代码时,结果只是一个包含80个元素的列表。但我需要这四个列表(
“Main.list”、“donube.list”、“Isar.list”和“Inn.list”
)每一个都分别包含80个
ntime
元素。@climdrag好的,我想我现在得到了,请看编辑。@climdrag抱歉,又错了。这次我真的,真的认为它是对的。谢谢你的努力。它现在似乎确实起作用了,在
new\u precip
中包含了四个列表。现在只剩下最后一步,将结果发送到
.GlobalEnv
会制造麻烦。当我做
list2env(new_precip,.GlobalEnv)
时,我在list2env(list,envir=.GlobalEnv)中收到错误消息
error:names(x)必须是与x长度相同的字符向量。你有解决方法吗?@climdrag是的,有一个小错误,代码行
names(纽约)
PRECIPITATION <- array(-199:200, dim = c(10, 10, 4))
mask_Main <- 
  mask_Danube <-
  mask_Isar <-
  mask_Inn <- matrix(-1:1, nrow = 10, ncol = 10)