【问题标题】:How to get list of matrices as a result of foreach?如何通过foreach获取矩阵列表?
【发布时间】:2012-03-30 00:38:01
【问题描述】:

我想改造下面的嵌套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 进行“参数化”,从而无需转换结果?

【问题讨论】:

    标签: r foreach


    【解决方案1】:

    你“只是”必须提供正确的.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]
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多