Изменить порядок строк в матрице / фрейме данных - PullRequest
24 голосов
/ 22 августа 2011

Мне нужно изменить / инвертировать строки в моем фрейме данных, не транспонируя данные, а перемещая нижний ряд в верхний и т. Д.Если кадр данных был:

1 2 3 
4 5 6
7 8 9

Мне нужно преобразовать в

7 8 9
4 5 6
1 2 3

Я прочитал о sort(), но я не думаю, что это то, что мне нужноне могу найти дорогу.

Ответы [ 6 ]

39 голосов
/ 22 августа 2011

Возможно, есть более элегантные способы, но это работает:

m <- matrix(1:9, ncol=3, byrow=TRUE)

# m[rev(seq_len(nrow(m))), ]  # Initial answer
m[nrow(m):1, ]
     [,1] [,2] [,3]
[1,]    7    8    9
[2,]    4    5    6
[3,]    1    2    3

Это работает, потому что вы индексируете матрицу с обратной последовательностью целых чисел в качестве индекса строки. nrow(m):1 приводит к 3 2 1.

27 голосов
/ 14 января 2015

Вы можете изменить порядок данных. Используя пакет dplyr:

iris %>% arrange(-row_number())

Или без использования pipe-оператора, выполнив

arrange(iris, -row_number())
7 голосов
/ 22 августа 2011

Я бы перевернул строки на индекс, начинающийся с количества строк, вдоль этой строки

revdata <-  thedata[dim(thedata)[1L]:1,]
4 голосов
/ 05 августа 2018

Я думаю, что это самый простой способ:

MyMatrix = matrix(1:20, ncol = 2)
MyMatrix[ nrow(MyMatrix):1, ]

Если вы хотите изменить столбцы, просто выполните

MyMatrix[ , ncol(MyMatrix):1 ]
4 голосов
/ 02 августа 2016

Мы можем изменить порядок имен строк (только для data.frame):

# create data.frame
m <- matrix(1:9, ncol=3, byrow=TRUE)
df_m <- data.frame(m)

#reverse
df_m[rev(rownames(df_m)), ]

#   X1 X2 X3
# 3  7  8  9
# 2  4  5  6
# 1  1  2  3
2 голосов
/ 04 июля 2016

Очень поздно, но это работает быстро, не требует дополнительных пакетов и просто:

for(i in 1:ncol(matrix)) {matrix[,i] = rev(matrix[,i])}

Полагаю, что при частом использовании из него можно было бы сделать функцию. Протестировано с R v = 3.3.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...