1

在语言 R 中,为了从旧矩阵 (N*3) 生成新矩阵 (N*6),有没有比下一个更好的方法来做到这一点,而不必“解包/取消列出”内部列表在应用函数中创建以“扩展”源矩阵?

transformed <- matrix(byrow=T)
transformed <- as.matrix(
    do.call("rbind", as.list(
      apply(dataset, 1, function(x) {
         x <- list(x[1], x[2], x[3], x[2]*x[3], x[2]^2, x[3]^2)
      })
    ))
) 

#Unpack all inner lists from the expanded matrix
ret_trans <- as.matrix( apply(transformed, 2, function(x) unlist(x)) )

编辑:我添加了一个例子

    dataset
     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    2    7   12
[3,]    3    8   13
[4,]    4    9   14
[5,]    5   10   15

在应用上面的代码时,我想扩展为 N*6、5*6(对不起,我拼错了上面的列尺寸,以及应用函数的边距)应该是这样的

transformed
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1    6    11   66   36   121 
[2,] 2    7    12   84   49   144 
[3,] 3    8    13   104  64   169 
[4,] 4    9    14   126  81   196 
[5,] 5    10   15   150  100  225 

问题是是否有另一种方法可以做到这一点,而不必使用最后一个 apply 函数,而不必强制 x 成为一个列表,谢谢大家的回复

4

1 回答 1

1

就像评论中建议的那样,做:

cbind(dataset, dataset[,2] * dataset[,3], dataset[,c(2, 3)]^2)

它会比 using 快很多apply,它应该看起来像这样:

transformed <- function(x) c(x[1], x[2], x[3], x[2]*x[3], x[2]^2, x[3]^2)
apply(dataset, 1, transformed)
于 2013-10-15T11:27:36.930 回答