我想转换以下嵌套for循环
first <- c(1, 2, 3)
second <- c(1, 2, 3)
dummy = matrix(double(), len(first), len(second))
c <- list()
c$sum <- dummy
c$times <- dummy
for (i in 1:len(first)) {
for (j in 1:len(second)) {
c$sum[i, j] <- first[i] + second[j]
c$times[i, j] <- first[i] * second[j]
}
}
c
使用foreach进入代码并获得相同的矩阵列表。我尝试了很多不同的东西,但最接近的“结果”是:
x <- foreach(b = second, .combine = "cbind") %:% foreach(a = first, .combine = "c") %do% {
c <- list()
c$sum <- a+b
c$times <- a*b
out <- c
}
x
如何使用foreach获取此矩阵列表?
编辑:一种可能是使用结果并在调用foreach后对其进行转换:
res <- list()
res$sum <- x[rownames(x)=="sum", ]
rownames(res$sum) <- NULL
colnames(res$sum) <- NULL
res$times <- x[rownames(x)=="times", ]
rownames(res$times) <- NULL
colnames(res$times) <- NULL
res
如何“参数化”foreach所以不需要转换结果?
答案 0 :(得分:2)
您“只需”提供正确的.combine
功能。
如果您只有数字,则可以返回数组而不是列表。
library(foreach)
library(abind)
first <- 1:3
second <- 4:5
x <-
foreach(b = second, .combine = function(...) abind(..., along=3)) %:%
foreach(a = first, .combine = rbind) %do% {
c( sum=a+b, times=a*b )
}
如果你真的需要列表,编写组合函数要困难得多。 相反,您可以构建一个data.frame,然后在需要时对其进行重新整形。
x <-
foreach(b = second, .combine = rbind) %:%
foreach(a = first, .combine = rbind) %do% {
data.frame(a=a, b=b, sum=a+b, times=a*b )
}
library(reshape2)
list(
sum = dcast(x, a ~ b, value.var="sum" )[,-1],
times = dcast(x, a ~ b, value.var="times")[,-1]
)