2012-02-03 3 views
18

У меня есть простая матрица, как:Как изменить матрицу в R?

> a = matrix(c(c(1:10),c(10:1)), ncol=2) 
> a 
     [,1] [,2] 
[1,] 1 10 
[2,] 2 9 
[3,] 3 8 
[4,] 4 7 
[5,] 5 6 
[6,] 6 5 
[7,] 7 4 
[8,] 8 3 
[9,] 9 2 
[10,] 10 1 

Я хотел бы получить этот результат:

 [,1] [,2] 
[1,] 10 1 
[2,] 9 2 
[3,] 8 3 
[4,] 7 4 
[5,] 6 5 
[6,] 5 6 
[7,] 4 7 
[8,] 3 8 
[9,] 2 9 
[10,] 1 10 

Точной реверс матрицы. Как я могу его получить? Благодаря

+18

Из примера, который вы использовали, не ясно, хотите ли вы столбцы или строки обращены вспять. Только для записи решение Дирка меняет порядок рядов, а моя меняет порядок столбцов. –

+1

Пришел сказать это именно так. Я в конечном итоге использовал решение Джоша, поскольку я искал обратные столбцы. Возможно, вы можете отредактировать это, чтобы у вас была матрица, более похожая на матрицу (1:20, nrow = 10). –

+0

Если вы применяете решения Josh или Dirk к массиву с размерами синглтона, R сбрасывает их. Вы можете обернуть вызовы так: 'array (reversing.thing, dim = dim (вещь))', чтобы это не происходило. –

ответ

24

Try rev с apply:

> a <- matrix(c(1:10,10:1), ncol=2) 
> a 
     [,1] [,2] 
[1,] 1 10 
[2,] 2 9 
[3,] 3 8 
[4,] 4 7 
[5,] 5 6 
[6,] 6 5 
[7,] 7 4 
[8,] 8 3 
[9,] 9 2 
[10,] 10 1 
> b <- apply(a, 2, rev) 
> b 
     [,1] [,2] 
[1,] 10 1 
[2,] 9 2 
[3,] 8 3 
[4,] 7 4 
[5,] 6 5 
[6,] 5 6 
[7,] 4 7 
[8,] 3 8 
[9,] 2 9 
[10,] 1 10 
+0

Почему бы не два раза повернуть? http://stackoverflow.com/a/16497058/54964, например 'rotate = function (mat) t (mat [nrow (mat): 1,, drop = FALSE])' из архива документов. –

+0

Это намного медленнее, чем подход 'a [, ncol (a): 1]', но имеет то преимущество, что его можно сделать inline, чтобы объявить 'b':' b = apply (matrix (c (1:10, 10 : 1), 10, 2), 2, rev) ' – MichaelChirico

+0

@ dirk-eddelbuettel Thx много. Это очень красивый и совершенный заменитель 'matlab :: flipud'. При использовании этой функции люди могут столкнуться со многими ошибками, но в вашем решении это очень аккуратно и идеально, ошибок не возникает. Одной из таких ошибок для flipud является «ошибка в оценке аргумента« объект »при выборе метода для функции« flipud »: ошибка в .findInheritedMethods (classes, fdef, mtable): пытается получить слот« группа »из объекта (класс «нестандартная функция», которая не является объектом S4 ». Еще раз большое спасибо Дирку. На самом деле, ваше решение является спасательным средством для многих случаев. –

10

Вот один из способов:

a[, rev(seq_len(ncol(a)))] 
     [,1] [,2] 
[1,] 10 1 
[2,] 9 2 
[3,] 8 3 
[4,] 7 4 
[5,] 6 5 
[6,] 5 6 
[7,] 4 7 
[8,] 3 8 
[9,] 2 9 
[10,] 1 10 
+1

Это также работает для любого большего числа измерений в массиве, к счастью - просто добавьте больше запятых и заменим 'ncol()' на 'dim() [n]'. –

+2

Почему не просто 'ncol (a): 1'? – MichaelChirico

+0

@MichaelChirico В то время как я не эксперт R, ваше решение, похоже, работает и будет более изящным для меня, поэтому я бы сказал, добавьте это как ответ! – doncherry

19
a[nrow(a):1,] 
#  [,1] [,2] 
# [1,] 10 1 
# [2,] 9 2 
# [3,] 8 3 
# [4,] 7 4 
# [5,] 6 5 
# [6,] 5 6 
# [7,] 4 7 
# [8,] 3 8 
# [9,] 2 9 
# [10,] 1 10 
Смежные вопросы