2013-10-15 5 views
1

в языке R, чтобы сгенерировать новую матрицу (N * 6) как из более старой (N * 3), есть лучший способ, чем следующий без необходимости «распаковывать/исключать» внутренние списки, созданные в функции apply, чтобы «расширить» исходную матрицу?do.call in 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))) 

EDIT: Я добавить пример того

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 

вопрос заключается в том, есть ли другой способ сделать это без того, чтобы использовать последнюю функцию применения, без необходимости принуждать й быть списком спасибо всем за ваши ответы

+0

Что делать вы ожидаете, что когда вы сделаете 'x [2]% *% x [3]'. Вы просто умножаете два скаляра. Почему бы не использовать 'x [2] * x [3]'? –

+1

не ваша оригинальная матрица N * 3, а не N * 2, как вы говорите? Если 'apply'-ed' 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) 
Смежные вопросы