これとこれのおまけ。
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
やはり同じ列名つけられるのにその列名で参照できないとは、うーむという感じ。