【问题标题】:cbind each matrix of list with each row of each matrix in another listcbind 列表的每个矩阵与另一个列表中每个矩阵的每一行
【发布时间】:2019-07-09 09:12:57
【问题描述】:

制作方法

第一个有 3 个元素。每个元素是 5*4 矩阵。我们称这些元素为m1、m2、m3

第二个也有 3 个元素。每个元素是 5*4 矩阵。我们称这些元素为n1、n2、n3

set.seed(1001)
first<-replicate(3,list(matrix(unlist(replicate(5,sample(c(1,2,3,4),4,replace=TRUE))),ncol=4)))
second<-replicate(3,list(matrix(unlist(replicate(5,sample(c(5,6,7,8),4,replace=TRUE))),ncol=4)))

> first
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    4    4    2    4
[2,]    2    1    1    1
[3,]    2    1    4    2
[4,]    2    2    2    1
[5,]    2    4    2    4

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    3    4    3    1
[2,]    2    3    4    1
[3,]    4    2    4    3
[4,]    3    4    2    3
[5,]    2    2    1    1

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    2    1    2    3
[2,]    1    4    2    2
[3,]    3    1    1    1
[4,]    1    3    3    1
[5,]    4    3    3    4

> second
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    7    7    8    5
[2,]    7    8    8    5
[3,]    7    5    8    7
[4,]    6    5    8    7
[5,]    6    6    6    5

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    6    7    8    8
[2,]    8    5    7    7
[3,]    7    6    5    8
[4,]    6    6    5    8
[5,]    7    6    7    5

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    5    7    7    6
[2,]    6    8    6    8
[3,]    5    5    5    5
[4,]    7    7    7    6
[5,]    5    8    8    5

我想要的是 cbind first 中的每个元素与 second 中每个元素的每一列。

n1 有 4 列。让我们将每一列称为n1c1、n1c2、n1c3、n1c4。

所以,我想生成m1+n1c1,m1+n1c2,m1+n1c3,m1+n1c4。

其他事情都是这样进行的。

m2+n2c1, m2+n2c2, m2+n2c3, m2+n2c4

m3+n3c1, m3+n3c2, m3+n3c3, m3+n3c4

这些将是这样的。

[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    4    4    2    4    7
[2,]    2    1    1    1    7
[3,]    2    1    4    2    7
[4,]    2    2    2    1    6
[5,]    2    4    2    4    6

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    4    4    2    4    7
[2,]    2    1    1    1    8
[3,]    2    1    4    2    5
[4,]    2    2    2    1    5
[5,]    2    4    2    4    6

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    4    4    2    4    8
[2,]    2    1    1    1    8
[3,]    2    1    4    2    8
[4,]    2    2    2    1    8
[5,]    2    4    2    4    6

...

[[12]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    1    2    3    6
[2,]    1    4    2    2    8
[3,]    3    1    1    1    5
[4,]    1    3    3    1    6
[5,]    4    3    3    4    5

我尝试了这些代码。但这一切都失败了。

out<-lapply(first, function(x) (cbind(first, second=x)))
out

[[1]]
     first             
[1,] Numeric,20 1 1 4 2
[2,] Numeric,20 2 2 1 4
[3,] Numeric,20 4 1 4 3
[4,] Numeric,20 4 4 2 1
[5,] Numeric,20 2 3 4 4

[[2]]
     first             
[1,] Numeric,20 1 3 1 4
[2,] Numeric,20 3 1 3 2
[3,] Numeric,20 2 2 4 1
[4,] Numeric,20 4 4 3 3
[5,] Numeric,20 2 4 1 3

[[3]]
     first             
[1,] Numeric,20 3 1 4 1
[2,] Numeric,20 4 2 2 1
[3,] Numeric,20 3 2 1 1
[4,] Numeric,20 2 2 3 1
[5,] Numeric,20 2 1 4 4

(我什至不知道什么是“Numeric,20”!)

这甚至失败了。

out<-lapply(first, function(x) lapply(1:nrow(x), function(y) cbind(first, second=y)))
out

[[1]]
[[1]][[1]]
     first      second
[1,] Numeric,20 1     
[2,] Numeric,20 1     
[3,] Numeric,20 1     

[[1]][[2]]
     first      second
[1,] Numeric,20 2     
[2,] Numeric,20 2     
[3,] Numeric,20 2     

[[1]][[3]]
     first      second
[1,] Numeric,20 3     
[2,] Numeric,20 3     
[3,] Numeric,20 3     

[[1]][[4]]
     first      second
[1,] Numeric,20 4     
[2,] Numeric,20 4     
[3,] Numeric,20 4     

[[1]][[5]]
     first      second
[1,] Numeric,20 5     
[2,] Numeric,20 5     
[3,] Numeric,20 5     


[[2]]
[[2]][[1]]
     first      second
[1,] Numeric,20 1     
[2,] Numeric,20 1     
[3,] Numeric,20 1     

[[2]][[2]]
     first      second
[1,] Numeric,20 2     
[2,] Numeric,20 2     
[3,] Numeric,20 2     

[[2]][[3]]
     first      second
[1,] Numeric,20 3     
[2,] Numeric,20 3     
[3,] Numeric,20 3     

[[2]][[4]]
     first      second
[1,] Numeric,20 4     
[2,] Numeric,20 4     
[3,] Numeric,20 4     

[[2]][[5]]
     first      second
[1,] Numeric,20 5     
[2,] Numeric,20 5     
[3,] Numeric,20 5     


[[3]]
[[3]][[1]]
     first      second
[1,] Numeric,20 1     
[2,] Numeric,20 1     
[3,] Numeric,20 1     

[[3]][[2]]
     first      second
[1,] Numeric,20 2     
[2,] Numeric,20 2     
[3,] Numeric,20 2     

[[3]][[3]]
     first      second
[1,] Numeric,20 3     
[2,] Numeric,20 3     
[3,] Numeric,20 3     

[[3]][[4]]
     first      second
[1,] Numeric,20 4     
[2,] Numeric,20 4     
[3,] Numeric,20 4     

[[3]][[5]]
     first      second
[1,] Numeric,20 5     
[2,] Numeric,20 5     
[3,] Numeric,20 5  

(这看起来很相似,但也失败了。)

我该如何解决这个问题?

【问题讨论】:

    标签: r list lapply cbind


    【解决方案1】:

    您可以尝试使用嵌套lapply

    lapply(seq_along(first), function(x) lapply(seq_len(ncol(second[[x]])), 
                        function(y) cbind(first[[x]], second[[x]][, y])))
    
    
    #[[1]]
    #[[1]][[1]]
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    4    4    2    4    7
    #[2,]    2    1    1    1    7
    #[3,]    2    1    4    2    7
    #[4,]    2    2    2    1    6
    #[5,]    2    4    2    4    6
    
    #[[1]][[2]]
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]    4    4    2    4    7
    #[2,]    2    1    1    1    8
    #[3,]    2    1    4    2    5
    #[4,]    2    2    2    1    5
    #[5,]    2    4    2    4    6
    #....
    

    或者使用Map稍微短一点

    Map(function(x, y) lapply(seq_len(ncol(y)), function(i) cbind(x, y[,i])),
                       first, second)
    

    【讨论】:

    • 谢谢。 lapply 更有用。我有一些问题。 1. 你可能还记得,我问过seq_along(x)mean 是什么意思。我知道seq_along(x) 的工作方式与1:nrow(x) 类似。但是,seq_along(x) 在lapply 函数中的作用是什么?这是否意味着将函数应用于 x 的每一行? 2. lapply函数中双括号和单括号有什么区别?
    • @ESKim seq_len 这里用于访问列表中的每一列,因为你想cbind second 到first 中的每一列我们在这里使用它。就双括号和单括号而言,这里的单括号会给你一个列表内的数据框,而双括号只会给你一个数据框。你可以在这里阅读更多内容stackoverflow.com/questions/1169456/…
    • 非常感谢。我想我也许可以更好地使用lapply 功能。
    【解决方案2】:

    你可以使用expand.grid

    Map(function(x) cbind(first[[x[1]]], second[[x[1]]][, x[2]]),  
        data.frame(t(rev(expand.grid(seq(ncol(first[[1]])), seq(length(second)))))))
    

    产量

    # $X1
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    3    4    1    5
    # [2,]    3    4    4    1    8
    # [3,]    3    3    4    3    5
    # [4,]    3    2    4    2    8
    # [5,]    4    2    4    3    6
    # 
    # $X2
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    3    4    1    8
    # [2,]    3    4    4    1    7
    # [3,]    3    3    4    3    6
    # [4,]    3    2    4    2    7
    # [5,]    4    2    4    3    6
    # 
    # $X3
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    3    4    1    8
    # [2,]    3    4    4    1    8
    # [3,]    3    3    4    3    6
    # [4,]    3    2    4    2    6
    # [5,]    4    2    4    3    8
    # 
    # $X4
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    3    4    1    8
    # [2,]    3    4    4    1    5
    # [3,]    3    3    4    3    5
    # [4,]    3    2    4    2    5
    # [5,]    4    2    4    3    7
    # 
    # $X5
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    1    2    4    5
    # [2,]    2    4    3    1    7
    # [3,]    4    2    4    4    7
    # [4,]    3    3    1    2    6
    # [5,]    4    2    2    4    7
    # 
    # $X6
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    1    2    4    7
    # [2,]    2    4    3    1    7
    # [3,]    4    2    4    4    6
    # [4,]    3    3    1    2    6
    # [5,]    4    2    2    4    7
    # 
    # $X7
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    1    2    4    5
    # [2,]    2    4    3    1    5
    # [3,]    4    2    4    4    8
    # [4,]    3    3    1    2    6
    # [5,]    4    2    2    4    6
    # 
    # $X8
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    1    2    4    6
    # [2,]    2    4    3    1    5
    # [3,]    4    2    4    4    8
    # [4,]    3    3    1    2    5
    # [5,]    4    2    2    4    6
    # 
    # $X9
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    1    1    1    7
    # [2,]    2    2    1    2    6
    # [3,]    2    4    3    4    7
    # [4,]    2    3    1    4    5
    # [5,]    4    1    4    4    6
    # 
    # $X10
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    1    1    1    7
    # [2,]    2    2    1    2    8
    # [3,]    2    4    3    4    5
    # [4,]    2    3    1    4    6
    # [5,]    4    1    4    4    6
    # 
    # $X11
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    1    1    1    5
    # [2,]    2    2    1    2    6
    # [3,]    2    4    3    4    8
    # [4,]    2    3    1    4    6
    # [5,]    4    1    4    4    7
    # 
    # $X12
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    1    1    1    8
    # [2,]    2    2    1    2    8
    # [3,]    2    4    3    4    5
    # [4,]    2    3    1    4    7
    # [5,]    4    1    4    4    7
    

    数据

    first <- list(structure(c(3, 3, 3, 3, 4, 3, 4, 3, 2, 2, 4, 4, 4, 4, 4, 
    1, 1, 3, 2, 3), .Dim = 5:4), structure(c(2, 2, 4, 3, 4, 1, 4, 
    2, 3, 2, 2, 3, 4, 1, 2, 4, 1, 4, 2, 4), .Dim = 5:4), structure(c(3, 
    2, 2, 2, 4, 1, 2, 4, 3, 1, 1, 1, 3, 1, 4, 1, 2, 4, 4, 4), .Dim = 5:4))
    
    second <- list(structure(c(5, 8, 5, 8, 6, 8, 7, 6, 7, 6, 8, 8, 6, 6, 8, 
    8, 5, 5, 5, 7), .Dim = 5:4), structure(c(5, 7, 7, 6, 7, 7, 7, 
    6, 6, 7, 5, 5, 8, 6, 6, 6, 5, 8, 5, 6), .Dim = 5:4), structure(c(7, 
    6, 7, 5, 6, 7, 8, 5, 6, 6, 5, 6, 8, 6, 7, 8, 8, 5, 7, 7), .Dim = 5:4))
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2017-09-10
      • 2019-01-27
      • 2019-04-13
      相关资源
      最近更新 更多