備忘ログ

チラシの裏的備忘録&メモ

Rで1列(任意の列)(1行)だけ列名(行名)を変える方法

Rで1列(任意の列)(1行)だけ列名(行名)を変更する方法

Rでデータフレーム(data.frame)の1列(1行)だけ列名(行名)を変更する方法をときどき忘れるのでメモ

baseでやる。

dplyrでもほかの方法でできる。

indenkun.hatenablog.com

データフレーム

# 適当なデータフレームを作る
d <- data.frame(matrix(1:12, nrow = 3, ncol = 4))
d
##   X1 X2 X3 X4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

これの1列目の列名だけを“ID”に変えたいと思ったときに

上手く行かない例

colnames(d) <- "ID"
d
##   ID NA NA NA
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

と指定していないのが列名がNAになってしまう。この方法だと、1列だけ名前を変えるのに全列名前を指定しなければ、指定しない列で名前が消えてしまう。

d <- data.frame(matrix(1:12, nrow = 3, ncol = 4))
colnames(d[1]) <- "ID"
d
##   X1 X2 X3 X4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

では変更できない。

colnames(d[["X1"]]) <- "ID"
## Error in `colnames<-`(`*tmp*`, value = "ID"): attempt to set 'colnames' on an object with less than two dimensions

ではエラーが出てしまう。

追記

上記の列名しては取り出しがベクトルになっているのでううまく定義できないよというものなで、列名指定でいうと、次のようにすると列名がえられる

colnames(d["X1"])
## [1] "X1"

これを応用して、次のようにしてやると列名が変わりそうだが変わらない。

colnames(d["X1"]) <- "ID"
d
##   X1 X2 X3 X4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

追記終了

できらぁ

colnames()の外(後ろ)に列番号を指定すると

colnames(d)[1] <- "ID"
d
##   ID X2 X3 X4
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

となり他の列名を汚さずに処理できる。

行名の場合はrownames()で同じように処理できる。

追記

ちなみに、

d <- data.frame(matrix(1:12, nrow = 3, ncol = 4))
colnames(d)["X1"]
## [1] NA

で列番号じゃなく、列名をcolnames()の外(後ろ)に指定してもうまく列名が取り出せないので、ここで変更することは難しい。

追記終了

おまけ

  • 列番号を1:4や複数c(1,3)と指定すると指定して一つだけ名前を与えると指定した列番号の列がみんな同じ列名で変更できるし、指定した列数にたいして名前の数が少ないとリサイクルされて同じ名前の列が生成される。 使いみちは思い至らないが、dplyrだと同一データフレーム内に同じ名前の列を生成できないので、baseの強み? 設計思想の違い?

  • 列名を指定しての処理ができない。 データがでかくなると何列目かよりも列名で指定できたほうが楽だが、同じ列名が存在する可能性としてはゼロではないので、どの列を変更するのか列名指定のほうが安全運用? dplyrなら列名のフルスペルで変更できる(後で書く)