【问题标题】:Use the original matrix to get a couple of new matrices使用原始矩阵得到几个新矩阵
【发布时间】:2013-05-01 05:38:30
【问题描述】:

我有一个由 4 列组成的矩阵(即第 1 列、第 2 列、第 3 列和第 4 列)

  V1 V2 V3 V4
1  1  1  1  1
2  1  1  1  1
3  1 -1 -1 -1
4  1 -1 -1 -1
5  2  1  1 -1
6  2  1  1 -1
7  2 -1 -1  1
8  2 -1 -1  1
9  3  1 -1  1
10 3  1 -1  1
11 3 -1  1 -1
12 3 -1  1 -1
13 4  1 -1 -1
14 4  1 -1 -1
15 4 -1  1  1
16 4 -1  1  1

我的问题是:我想使用这 4 列来获得 3 个新矩阵。
这些矩阵由以下列组成:12, 13, 14, 23, 24, 34, 123, 124, 134, 234, 1234. 这里我用 12 代表column 1 * column 2

第一个矩阵有6列:12, 13, 14, 23, 24, 34

    X1 X2 X3 X4 X5 X6 
1    1  1  1  1  1  1  
2    1  1  1  1  1  1  
3   -1 -1 -1  1  1  1  
4   -1 -1 -1  1  1  1  
5    2  2 -2  1 -1 -1 
6    2  2 -2  1 -1 -1  
7   -2 -2  2  1 -1 -1  
8   -2 -2  2  1 -1 -1  
9    3 -3  3 -1  1 -1 
10   3 -3  3 -1  1 -1 
11  -3  3 -3 -1  1 -1 
12  -3  3 -3 -1  1 -1 
13   4 -4 -4 -1 -1  1 
14   4 -4 -4 -1 -1  1 
15  -4  4  4 -1 -1  1 
16  -4  4  4 -1 -1  1 

第二个矩阵有 4 列:123, 124, 134, 234
最后一个矩阵有一列:1234

有没有人有一些简单的代码可以做到这一点?感谢大家的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以创建一个小函数来完成这个任务(假设他的帖子中使用的 OP 相同类型的符号)

    create_prodmat <- function(mat, cols) {
    
    index <- lapply(strsplit(cols, ""), as.numeric)
    
    res <- do.call("cbind",
                   lapply(index, function(i) apply(mat[, i, drop = FALSE], 1, prod))
                   )
    colnames(res) <- cols
    res
    
    }
    
    
    
    mat <- matrix(rep(c(1, 2, 3), each = 4), ncol = 3)
    mat
    
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    ## [2,]    1    2    3
    ## [3,]    1    2    3
    ## [4,]    1    2    3
    
    
    cols1 <- c("12", "13", "23")
    cols2 <- "13"
    
    create_prodmat(mat, cols1)
    
    ##      12 13 23
    ## [1,]  2  3  6
    ## [2,]  2  3  6
    ## [3,]  2  3  6
    ## [4,]  2  3  6
    
    
    create_prodmat(mat, cols2)
    
    ##        13
    ## [1,]    3
    ## [2,]    3
    ## [3,]    3
    ## [4,]    3
    

    【讨论】:

      【解决方案2】:

      假设您的数据框名为dat。如果我正确理解您的问题,您可以执行以下操作

      A1 <- as.matrix(dat[,c(1,2,2,3)] * dat[,c(4,3,4,4)])
      A2 <- as.matrix(dat[,c(1,1,1,2)] * dat[,c(2,2,3,3)] * dat[,c(3,4,4,4)])
      A3 <- as.matrix(dat[,1] * dat[,2] * dat[,3] * dat[,4])
      

      【讨论】:

        【解决方案3】:

        以下应该做到这一点。
        我逐行分解它,所以它应该很容易理解。如果您需要解释,请告诉我。

        newColumns <- "14, 23, 24, 34, 123, 124, 134, 234, 1234"
        
        splat1 <- strsplit(newColumns, ", ")[[1]]
        
        splat <- strsplit(splat1, "")
        
        splat <- lapply(splat, as.numeric)
        
        results <- sapply(splat, function(cols) apply(master.matrix[, cols, drop=FALSE], 1, prod))
        
        first <- results[, 1:4]
        second <- results[, 5:8]
        third <- results[, 9, drop=FALSE]
        
        first; second; third
        
                 [,1] [,2] [,3] [,4]
          1     1    1    1    1
          2     1    1    1    1
          3    -1    1    1    1
          4    -1    1    1    1
          5    -2    1   -1   -1
          6    -2    1   -1   -1
          7     2    1   -1   -1
          8     2    1   -1   -1
          9     3   -1    1   -1
          10    3   -1    1   -1
          11   -3   -1    1   -1
          12   -3   -1    1   -1
          13   -4   -1   -1    1
          14   -4   -1   -1    1
          15    4   -1   -1    1
          16    4   -1   -1    1
             [,1] [,2] [,3] [,4]
          1     1    1    1    1
          2     1    1    1    1
          3     1    1    1   -1
          4     1    1    1   -1
          5     2   -2   -2   -1
          6     2   -2   -2   -1
          7     2   -2   -2    1
          8     2   -2   -2    1
          9    -3    3   -3   -1
          10   -3    3   -3   -1
          11   -3    3   -3    1
          12   -3    3   -3    1
          13   -4   -4    4    1
          14   -4   -4    4    1
          15   -4   -4    4   -1
          16   -4   -4    4   -1
             [,1]
          1     1
          2     1
          3    -1
          4    -1
          5    -2
          6    -2
          7     2
          8     2
          9    -3
          10   -3
          11    3
          12    3
          13    4
          14    4
          15   -4
          16   -4
        

        【讨论】:

        • 当 OP 说“column1 * column2”时,我认为他想要第 1 列和第 2 列的乘积,但可能我错了
        • @Stacy 这不符合你的问题?
        • @RicardoSaporta 我将列编辑为12, 13, 14, 23, 24, 34, 123, 124, 134, 234, 1234. 所以新列应该是12, 13, 14, 23, 24, 34, 123, 124, 134, 234, 1234 感谢您的帮助。 :)
        猜你喜欢
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        相关资源
        最近更新 更多