2018年2月9日金曜日

Rのデータフレームで、列名指定で列名の一部を変更する方法

まずは、動作確認用のサンプルコードです。

# サンプルコードのデータフレーム
age    <- c( 20,  30,  40)
height <- c(170, 168, 175)
wait   <- c( 67,  64,  70)
df <- data.frame(age, height, wait)


df

  age height wait
1  20    170   67
2  30    168   64
3  40    175   70


ちょ、待てよ。体重のweightがwaitになってんじゃん。

ってことで、この列名だけ変更したいと。

列名全体のベクトルをまとめて指定して変更する方法↓

names(df) <- c("age", "height", "weight")


とか、

インデックス番号を使って、一部を変更する方法↓

names(df)[3] <- "weight"

とかがあるんですが、列数がめちゃめちゃ多いデータだと数えるのが大変だし、列の削除や挿入に対してロバストでないし。できれば、列名の指定で変更を行いたい。

ちょっとコードがごちゃごちゃしますが、↓こんな感じでできます。

names(df)[ which( names(df)=="wait" ) ] <- "weight"


内側から順に見ていくと・・・

names(df)=="wait" で、列名が "wait" になっている位置が

FALSE FALSE TRUE

というベクトルで返ってきます。

それを which() に渡すと、「3」というインデックス番号が返ってきます。

なのでこの「3」を names(df)[] に対するインデックスの指定に使えばOKというわけです。