【问题标题】:Make a list of matrices where each matrix is one row of dataframe制作一个矩阵列表,其中每个矩阵是一行数据帧
【发布时间】:2021-07-27 02:43:46
【问题描述】:

我想制作一个 2x2 矩阵的列表,其中数据帧的每一行都变成一个 2x2 矩阵。我将使用一个巨大的数据集(为方便起见的玩具示例),所以我试图弄清楚如何在没有 for 循环的情况下做到这一点。我一直在尝试使用自制函数和 apply() 来执行此操作,但收到一条错误消息。

dat<-data.frame(x1=c(2,3,4),
               x2=c(1,2,3),
               x3=c(5,76,7),
               x4=c(4,6,0))

make_matrix<-function(df){
  with(dat, matrix(c(x1,x2,x3, x4),byrow=T,nrow=2, ncol=2))
  }

apply(dat, 1, FUN=make_matrix)
  
Error in eval(substitute(expr), data, enclos = parent.frame()) : 
  numeric 'envir' arg not of length one 

【问题讨论】:

    标签: r matrix error-handling apply do.call


    【解决方案1】:

    我们可以使用asplit

    lapply(asplit(dat, 1), matrix, 2, 2, byrow = TRUE)
    

    -输出

    #[[1]]
    #     [,1] [,2]
    #[1,]    2    1
    #[2,]    5    4
    
    #[[2]]
    #     [,1] [,2]
    #[1,]    3    2
    #[2,]   76    6
    
    #[[3]]
    #     [,1] [,2]
    #[1,]    4    3
    #[2,]    7    0
    

    OP 的函数参数和主体不匹配,即它接受一个参数“df”并且在函数内部使用dat。但是,这不是唯一的问题。当我们遍历该行时,它是一个值向量,with 将无法处理这些值。因为我们需要list,所以matrix 可以包裹在list

    make_matrix <- function(x) list(matrix(x, byrow = TRUE, ncol = 2, nrow = 2))
    

    应该有效

    do.call(c, apply(dat, 1, make_matrix))
    #[[1]]
    #     [,1] [,2]
    #[1,]    2    1
    #[2,]    5    4
    
    #[[2]]
    #     [,1] [,2]
    #[1,]    3    2
    #[2,]   76    6
    
    #[[3]]
    #     [,1] [,2]
    #[1,]    4    3
    #[2,]    7    0
    

    【讨论】:

      【解决方案2】:

      这是另一个使用array的选项

      mat <- array(c(t(dat)), c(2, 2, 3))
      mat[] <- apply(mat, 3, t)
      

      给了

      > mat
      , , 1
      
           [,1] [,2]
      [1,]    2    1
      [2,]    5    4
      
      , , 2
      
           [,1] [,2]
      [1,]    3    2
      [2,]   76    6
      
      , , 3
      
           [,1] [,2]
      [1,]    4    3
      [2,]    7    0
      

      如果你想得到list形式的结果,你可以试试

      Map(t, asplit(array(c(t(dat)), c(2, 2, 3)), 3))
      

      给了

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

      【讨论】:

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