web-dev-qa-db-ja.com

行列/データフレームの行の順序を変更する

データを転置するのではなく、下の行を上に移動するなど、データフレームの行を変更/反転する必要があります。データフレームが次の場合:

_1 2 3 
4 5 6
7 8 9
_

に変換する必要があります

_7 8 9
4 5 6
1 2 3
_

私はsort()について読みましたが、それが私が必要とするものではないと思います、または方法を見つけることができません。

25
pacomet

おそらくもっとエレガントな方法がありますが、これはうまくいきます:

_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_になります。

39
Andrie

dplyrパッケージを使用して、data.frameの順序を逆にすることができます。

iris %>% arrange(-row_number())

またはパイプオペレーターを使用せずに

arrange(iris, -row_number())
27
Holger Brandl

この行に沿って、行数で始まるインデックスの行を逆にします

revdata <-  thedata[dim(thedata)[1L]:1,]
7
Henrik

私はこれが最も簡単な方法だと思います:

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

列を逆にしたい場合は、

MyMatrix[ , ncol(MyMatrix):1 ]
4
Rtist

Row.namesの順序を逆にすることができます(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
4
zx8754

Veeeryは遅くなりますが、これは高速に動作しているようで、追加のパッケージを必要とせず、簡単です:

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

私は、頻繁に使用するために、それから機能を作成すると思います。 R v = 3.3.1でテスト済み。

2
theogrost

今日この問題に遭遇し、ここで私はあなたの利益のために別の解決策を提供しています。

m <- matrix(1:9, ncol=3, byrow=TRUE)    
apply(m,2,rev)
1
Z Cao