備忘ログ

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

列名にNAや同一列名が含まれているとどうなるのか

indenkun.hatenablog.com

indenkun.hatenablog.com

これとこれのおまけ。

Rでのデータフレームの扱いについての話。

列名にNAが含まれていたり、同じ列名を含むデータフレームだとdplyrだと上手く扱えない(というか作れない)。

baseだと作れてしまうが、その後の取り扱いについてどうなっているのかみてみた。

列名にNAが含まれている場合

列名にNAが含まれているデータフレームを作るには、明示的baseのcolnamesを使って列名をNAに変える必要がある。

d <- data.frame(matrix(1:12, nrow = 3, ncol = 4))
colnames(d) <- NA
d
##   NA NA NA NA
## 1  1  4  7 10
## 2  2  5  8 11
## 3  3  6  9 12

これをwrite.csvで書き出して、read.csvやreadr::read_csvで読み込むと、NAにならないように適当な名前を作られてしまう。

NA列を確認してみようとすると

d[[NA]]
## NULL
d[[]]
## Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x, :  引数 "i" がありませんし、省略時既定値もありません
d[["NA"]]
## NULL
d[['NA']]
## NULL

となり取り出せない。

列番号だと取り出せる。

d[1]
##   NA
## 1  1
## 2  2
## 3  3

ということでbaseで列名にNAはつけられるがその列名はbaseでも扱えないので、うーむという感じ。

同じ名前の列名が同じデータフレームに存在する場合

これも、csvファイルのヘッダーで名前をつけるときにもとのファイルで同じ名前の列があっても、read.csvだと無警告に.1など、readr::read_csvだと警告出しながら_1と勝手にリネームされるので、baseのcolnamesで明示的に作ってやるしかない。

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

これでID列を確認すると

d$ID
## [1] 1 2 3
d[["ID"]]
## [1] 1 2 3

となり1列目のみが出力されるので、IDで2列目は参照できない。

列番号だともちろん参照できる。

d[1]
##   ID
## 1  1
## 2  2
## 3  3
d[2]
##   ID
## 1  4
## 2  5
## 3  6

やはり同じ列名つけられるのにその列名で参照できないとは、うーむという感じ。