いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【R】データフレームの行や列の順番を変えたい

・お題:データフレームの行や列の順番を変えたい

 

・データフレームを作成する。

> df = data.frame(A = c(1.1, 2.1, 3.1, 4.1, 5.1),
+                 B = c(1.2, 2.2, 3.2, 4.2, 5.2),
+                 C = c(1.3, 2.3, 3.3, 4.3, 5.3),
+                 D = c(1.4, 2.4, 3.4, 4.4, 5.4),
+                 E = c(1.5, 2.5, 3.5, 4.5, 5.5),
+                 row.names = c("Row1", "Row2", "Row3", "Row4", "Row5"))
> df

 

・列の順番を変えてみる。

> col_order_1 = c("B", "C", "D", "E", "A")
> df[, col_order_1]

 

・同じ列が複数あると、列名が重複しないようにナンバリングされる。

> col_order_2 = c("A", "A", "D", "D")
> df[, col_order_2]

 

・存在しない列名を与えると、エラーが出る。

> col_order_3 = c("F", "D", "C", "B", "A")
> df[, col_order_3]
Error in `[.data.frame`(df, , col_order_3) :  未定義の列が選ばれました

 

・行も似たような感じ。

> row_order_1 = c("Row3", "Row4", "Row5", "Row1", "Row2")
> df[row_order_1,]

 

・行名も重複を許さないらしい。

> row_order_2 = c("Row3", "Row3", "Row1", "Row1")
> df[row_order_2,]

 

・ちなみに、ありえない行名が含まれていた場合はNAになる(ありえない列名が入っていた場合と挙動が違う)。

> row_order_3 = c("Row1", "Row2", "Row6")
> df[row_order_3,]

 

・列の順番を丸ごと逆にしたければ、colnamesとrevを使えば行けそう。

> colnames(df)
[1] "A" "B" "C" "D" "E"
> rev(colnames(df) )
[1] "E" "D" "C" "B" "A"
> df[, rev(colnames(df) ) ]

 

 

おわり