【问题标题】:Subtraction of list of matrix within a list in RR中列表中矩阵列表的减法
【发布时间】:2020-11-30 02:11:19
【问题描述】:

我有一个list,其中包含list 的矩阵如下:

$A
$A[[1]]
$A[[1]][[1]]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10


$A[[2]]
$A[[2]][[1]]
     [,1] [,2]
[1,]    2    7
[2,]    3    8
[3,]    4    9
[4,]    5   10
[5,]    6   11



$B
$B[[1]]
$B[[1]][[1]]
     [,1] [,2]
[1,]   11   16
[2,]   12   17
[3,]   13   18
[4,]   14   19
[5,]   15   20


$B[[2]]
$B[[2]][[1]]
     [,1] [,2]
[1,]   12   17
[2,]   13   18
[3,]   14   19
[4,]   15   20
[5,]   16   21



$C
$C[[1]]
$C[[1]][[1]]
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0
[4,]    0    0
[5,]    0    0


$C[[2]]
$C[[2]][[1]]
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0
[4,]    0    0
[5,]    0    0

上面的矩阵列表是使用下面的代码创建的:

A_mat1 <- matrix(as.numeric(c(1:10)), nrow = 5, ncol = 2)
B_mat1 <- matrix(as.numeric(c(11:20)), nrow = 5, ncol = 2)
C_mat1 <- matrix(as.numeric(0), nrow = 5, ncol = 2)
A_mat2 <- matrix(as.numeric(c(2:11)), nrow = 5, ncol = 2)
B_mat2 <- matrix(as.numeric(c(12:21)), nrow = 5, ncol = 2)
C_mat2 <- matrix(as.numeric(0), nrow = 5, ncol = 2)

my_matrix_name <- as.vector(c("A_mat1", "B_mat1", "C_mat1", "A_mat2", "B_mat2", "C_mat2"))
my_list = list(A_mat1, B_mat1, C_mat1, A_mat2, B_mat2, C_mat2)
names(my_list) <- my_matrix_name

my_A <- as.vector(my_matrix_name[substring(my_matrix_name,1,1) == "A"])
my_B <- as.vector(my_matrix_name[substring(my_matrix_name,1,1) == "B"])
my_C <- as.vector(my_matrix_name[substring(my_matrix_name,1,1) == "C"])

A = list()
for(i in seq_len(length(my_A))){
  A[[i]] <- list(my_list[[paste0(my_A[[i]])]])
}

B = list()
for(i in seq_len(length(my_B))){
  B[[i]] <- list(my_list[[paste0(my_B[[i]])]])
}

C = list()
for(i in seq_len(length(my_C))){
  C[[i]] <- list(my_list[[paste0(my_C[[i]])]])
}

my_group = list(A,B,C)
names(my_group) <- c("A", "B", "C")
my_group

其中组C 矩阵的值为0。现在我想创建一个公式来覆盖组C 等于组A 减去组B 即C = A - B

我尝试过使用

my_group[[3]] = my_group[[1]] - my_group[[2]]

my_group[[3]] = Map("-", my_group[[1]] , my_group[[2]])

但它给出了错误消息:二进制运算符的非数字参数。任何人都可以帮助我吗?谢谢!

【问题讨论】:

    标签: r list matrix subtraction


    【解决方案1】:

    因为您有嵌套列表,所以您的 Map 函数实际上是在尝试从另一个列表中减去一个列表。您需要映射函数来提取每个列表的第一个元素并减去这些元素

    Map(function(A, B) A[[1]] - B[[1]], my_group$A , my_group$B)
    #> [[1]]
    #>      [,1] [,2]
    #> [1,]  -10  -10
    #> [2,]  -10  -10
    #> [3,]  -10  -10
    #> [4,]  -10  -10
    #> [5,]  -10  -10
    #> 
    #> [[2]]
    #>      [,1] [,2]
    #> [1,]  -10  -10
    #> [2,]  -10  -10
    #> [3,]  -10  -10
    #> [4,]  -10  -10
    #> [5,]  -10  -10
    

    【讨论】:

    • 像魅力一样工作!对了,你能给我解释一下 x[[1]] - y[[1]] 在这里做什么?
    【解决方案2】:

    pmap 的选项

    library(purrr)
    pmap(my_group[c('A', 'B')], ~ ..1[[1]] - ..2[[1]])
    #[[1]]
    #     [,1] [,2]
    #[1,]  -10  -10
    #[2,]  -10  -10
    #[3,]  -10  -10
    #[4,]  -10  -10
    #[5,]  -10  -10
    
    #[[2]]
    #     [,1] [,2]
    #[1,]  -10  -10
    #[2,]  -10  -10
    #[3,]  -10  -10
    #[4,]  -10  -10
    #[5,]  -10  -10
    

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2020-11-23
      • 2015-04-24
      相关资源
      最近更新 更多