2016-05-01 16 views
1

假设一个列表对象和矢量:R.乘以不同的标量超过元素的列表,并总和的每一个元素

lst <- list(a = matrix(1:9, 3), b = matrix(2:10, 3)) 
vec <- c(2, 3) 

而且我想要得到的结果类似

2 * a + 3 * b 

我解决这个由

matrix(apply(mapply("*", lst, vec), 1, sum), 3, 3) 

但这看起来有点麻烦。

有没有一种有效的方法来获得相同的结果?

+1

'的eval(替代(2 * A + 3 * B ),lst)'的作品,但我现在知道如果“高效”是一个词,我会用它来形容它... – r2evans

回答

1

不知道它是否更有效,但这里有一个更清洁的想法。您可以使用Map()进行乘法,使用Reduce()进行求和。

Reduce("+", Map("*", lst, vec)) 
#  [,1] [,2] [,3] 
# [1,] 8 23 38 
# [2,] 13 28 43 
# [3,] 18 33 48 

而且,在你的代码,你可以用rowSums()更换apply()电话。这可能会提高你所做的工作的效率。

+0

非常感谢!它看起来好多了。 –

0

另一种选择是通过列表的序列循环,然后乘以

Reduce(`+`,lapply(seq_along(lst), function(i) lst[[i]]*vec[i])) 

对于list和两个元件

vector
lst[[1]]*vec[1] + lst[[2]] * vec[2] 
相关问题