2013-10-15 25 views
1

,为了从较旧的(N * 3)生成一个新的矩阵(N * 6),是否有比下一个更好的方法它不必“解开/取消列表”在apply函数中创建的内部列表,以便“展开”源矩阵?用矩阵表示,并且用语言R列出

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 

的问题是,如果有这样做的另一种方式,而不必使用过去的应用功能,而不必强迫在x是一个列表 感谢所有您的答复

+0

怎么办当你做'x [2]%*%x [3]'时,你会期望发生。你只是乘以两个标量。为什么不使用'x [2] * x [3]'? –

+1

是不是你的原始矩阵N * 3而不是N * 2像你说的那样?应用“MARGIN”应该是“1”还是“2”?你如何在一个小例子上展示你的预期输出是什么?然后看看'cbind(x,x [,2] * x [,3],x [,2]^2,x [,3]^2)'是不是...... – flodel

+1

@flodel&SimonO101你们都是正确的,交叉产品是一个拼写错误以及保证金,我在R的一开始,所以对所有的错误 –

回答

1

就像在意见提出,这样做:

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

这将是一个很多比使用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)