mapply 从两个不同的列表和 return 矩阵列表中减去矩阵
mapply to subtract matrices from two different lists and return a list of matrix
我有两个矩阵列表,每个列表有12个矩阵。我想从每个列表中减去两个矩阵。这是可重现的例子:
x1 <- matrix((1:25)*0.1, ncol=5)
x2<-x1+0.3
list1<-list(x1,x2)
list2<-list(x1*2,x2*0.1)
sub<-mapply("-",list1,list2)
这个returns输出为
> sub
[,1] [,2]
[1,] -0.1 0.36
[2,] -0.2 0.45
[3,] -0.3 0.54
[4,] -0.4 0.63
[5,] -0.5 0.72
[6,] -0.6 0.81
[7,] -0.7 0.90
[8,] -0.8 0.99
[9,] -0.9 1.08
[10,] -1.0 1.17
[11,] -1.1 1.26
[12,] -1.2 1.35
[13,] -1.3 1.44
[14,] -1.4 1.53
[15,] -1.5 1.62
[16,] -1.6 1.71
[17,] -1.7 1.80
[18,] -1.8 1.89
[19,] -1.9 1.98
[20,] -2.0 2.07
[21,] -2.1 2.16
[22,] -2.2 2.25
[23,] -2.3 2.34
[24,] -2.4 2.43
[25,] -2.5 2.52
我希望输出为 5x5 矩阵列表:例如
>list1[[1]]-list2[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] -0.1 -0.6 -1.1 -1.6 -2.1
[2,] -0.2 -0.7 -1.2 -1.7 -2.2
[3,] -0.3 -0.8 -1.3 -1.8 -2.3
[4,] -0.4 -0.9 -1.4 -1.9 -2.4
[5,] -0.5 -1.0 -1.5 -2.0 -2.5
将 simplify
参数添加到 mapply
会引发以下错误:
Error in .Primitive("-")(dots[[1L]][[1L]], dots[[2L]][[1L]], simplify = dots[[3L]][[1L]]) :
operator needs one or two arguments
如何获取列表?
正如@Sotos 评论的那样,使用 Map
包装器 mapply
将结果输出为列表而不是绑定矩阵。事实上,您仍然可以使用 mapply
但使用 SIMPLIFY = FALSE
参数。注意:SIMPLIFY
与其他同名应用系列参数不同,全部大写。
使用默认值 TRUE,mapply 将每个差异转换为矩阵。以下是等效调用:
sub1 <- Map(`-`, list1, list2)
sub2 <- mapply(`-`, list1, list2, SIMPLIFY = FALSE)
all.equal(sub1, sub2)
# [1] TRUE
我有两个矩阵列表,每个列表有12个矩阵。我想从每个列表中减去两个矩阵。这是可重现的例子:
x1 <- matrix((1:25)*0.1, ncol=5)
x2<-x1+0.3
list1<-list(x1,x2)
list2<-list(x1*2,x2*0.1)
sub<-mapply("-",list1,list2)
这个returns输出为
> sub
[,1] [,2]
[1,] -0.1 0.36
[2,] -0.2 0.45
[3,] -0.3 0.54
[4,] -0.4 0.63
[5,] -0.5 0.72
[6,] -0.6 0.81
[7,] -0.7 0.90
[8,] -0.8 0.99
[9,] -0.9 1.08
[10,] -1.0 1.17
[11,] -1.1 1.26
[12,] -1.2 1.35
[13,] -1.3 1.44
[14,] -1.4 1.53
[15,] -1.5 1.62
[16,] -1.6 1.71
[17,] -1.7 1.80
[18,] -1.8 1.89
[19,] -1.9 1.98
[20,] -2.0 2.07
[21,] -2.1 2.16
[22,] -2.2 2.25
[23,] -2.3 2.34
[24,] -2.4 2.43
[25,] -2.5 2.52
我希望输出为 5x5 矩阵列表:例如
>list1[[1]]-list2[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] -0.1 -0.6 -1.1 -1.6 -2.1
[2,] -0.2 -0.7 -1.2 -1.7 -2.2
[3,] -0.3 -0.8 -1.3 -1.8 -2.3
[4,] -0.4 -0.9 -1.4 -1.9 -2.4
[5,] -0.5 -1.0 -1.5 -2.0 -2.5
将 simplify
参数添加到 mapply
会引发以下错误:
Error in .Primitive("-")(dots[[1L]][[1L]], dots[[2L]][[1L]], simplify = dots[[3L]][[1L]]) :
operator needs one or two arguments
如何获取列表?
正如@Sotos 评论的那样,使用 Map
包装器 mapply
将结果输出为列表而不是绑定矩阵。事实上,您仍然可以使用 mapply
但使用 SIMPLIFY = FALSE
参数。注意:SIMPLIFY
与其他同名应用系列参数不同,全部大写。
使用默认值 TRUE,mapply 将每个差异转换为矩阵。以下是等效调用:
sub1 <- Map(`-`, list1, list2)
sub2 <- mapply(`-`, list1, list2, SIMPLIFY = FALSE)
all.equal(sub1, sub2)
# [1] TRUE