如何在R中求和重复函数的结果

时间:2018-04-02 04:03:05

标签: r

我的功能非常复杂。我需要多次重复此功能并对结果求和。这很简单。但是,我需要在同一时间总结它们。由于我的功能很难在这里展示,我提供了一个非常简单的例子来解释我的想法。请注意(根据评论中的惊人问题)我的功能需要成对完成。另外,我的矩阵都是相同的尺寸。最后,结果不是列表。我需要将结果分配给一个新变量。也就是说,

Res <– myfunc(x[i,j],y[i,j])+myfunc(z[i,j],t[i,j])+..+..

此外,我的函数必须循环遍历矩阵的元素。 x[i,j]

我的矩阵存储在列表中。

Mymatrices–list(x,y,z,t)

例如,

x <- matrix(5,5,5)
x[upper.tri(x,diag=T)] <- 0
y <– matrix(4,5,5)
y[upper.tri(y,diag=T)] <- 0
z <- matrix(3,5,5)
z[upper.tri(z,diag=T)] <- 0
t <- matrix(2,5,5)
t[upper.tri(t,diag=T)] <- 0

myfunc <– function(x,y){

sum(x,y)

}

我想这样:

 Res <– myfunc(x[i,j],y[i,j])+myfunc(z[i,j],t[i,j])+..+..

假设我有10个矩阵,并希望得到如上所示的总和。很难手动完成。我想自动这样做。 lapply函数采用列表,我不希望它作为列表。

请帮忙吗?

3 个答案:

答案 0 :(得分:0)

假设你的矩阵在列表中,按照你想要的方式配对:

input = list(list(x, y), list(z, t))

为方便起见,我们将创建一个以list为输入的函数版本(我们可以使用do.call或匿名函数,但这很清楚):

myfunc_list = function(x) {
    myfunc(x[[1]], x[[2]])
}

然后,我们可以sapply列表功能到您的输入列表,sum

sum(sapply(input, myfunc_list))
# [1] 140

答案 1 :(得分:0)

我不能告诉你最后是否需要一个矩阵或一个值。但是因为你使用i,j我认为你需要一个矩阵:

Reduce("+",list(x,y,z,t))
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]   14    0    0    0    0
[3,]   14   14    0    0    0
[4,]   14   14   14    0    0
[5,]   14   14   14   14    0

或者你需要:

 Reduce(sum,list(x,y,z,t))
[1] 140

答案 2 :(得分:0)

很高兴能帮上忙。说实话,我仍然不能完全确定你要求的是什么 - 没有人认为你的最终答案是一个清单,只是为了有效地进行总结的中间步骤。看看答案,我认为Onyambu建议的Reduce函数就是你所需要的 - 其中x,y,z和t是函数的结果(在不同的矩阵上称为成对)。

总和是否真的需要帮助,或者它是否在所有这些矩阵上有效地调用函数?这是一个非常不同的问题。如果是这种情况,请查看map2包中的purrr功能。它需要两个列表(长度相同)作为输入,计算每个元素的函数,并返回一个列表(可以输入Reduce)。