2013-10-15 60 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)