我想将矩阵列表(一行)相乘,如下所示:
lst <- list("111.2012"=matrix(c(1, 0, 6, NA, 1, 0),
nrow = 1, byrow = T),
"112.2012"=matrix(c(6, 2, 2, 0, 3, NA),
nrow = 1, byrow = T))
使用这样的矢量(与每个矩阵的长度相同):
vec <- c(1,2,3,1,2,3)
期待这个结果:
$`111.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 0 18 NA 2 0
$`112.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 4 6 0 6 NA
我到目前为止尝试了这个:
mapply("*", lst, vec)
Map("*", lst, vec)
这给了我三倍的数字和错误的数字。我还考虑过在mapply中使用lapply来添加列表,但是我不知道该怎么做。有什么建议?感谢
答案 0 :(得分:5)
我相信您正在寻找lapply()
,因为您使用的是列表lapply( lst, FUN= function(x) x*vec)
有关详细信息,请参阅this。
希望有所帮助!
lapply(lst,FUN= function(x) x*vec) ## My old clunky way
lapply(lst, "*" , vec) ## As informed by Richard Scriven (Thanks!)
$`111.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 0 18 NA 2 0
$`112.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 4 6 0 6 NA
答案 1 :(得分:1)
Map/mapply
通过将函数应用于输入变量的相应元素来工作。对于长度为2的list
,我们有2个元素,即lst[[1]]
和lst[[2]]
,对于长度为6的vector
,它将为6.因此,这会产生不等式。为了纠正这个问题,我们将矢量放在list
(通过list
包裹)中,以便将其再循环到“{1}”的长度。并将作为整体用于“第一个”中的每个元素。
Map("*", lst, list(vec))
#$`111.2012`
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 1 0 18 NA 2 0
#$`112.2012`
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 6 4 6 0 6 NA