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