1.5 データ構造(4)データフレーム

データフレームは、同じ長さの複数のベクトルを要素とするリストで、表形式のデータを扱うためのデータ構造です。行列と違い、各列のデータ型は異なっても構いません。データフレームの各行を個体、各列を変数と呼びます。データフレームを作成するには、data.frame()関数を用います。引数はlist()関数と同様です。

pacific_seiseki <- data.frame(pacific = pacific,
                              win = c(82, 74, 74, 73, 66, 64),
                              lose = c(59, 66, 68, 69, 73, 78))
pacific_seiseki
##        pacific win lose
## 1         楽天  82   59
## 2         西武  74   66
## 3       ロッテ  74   68
## 4 ソフトバンク  73   69
## 5   オリックス  66   73
## 6     日本ハム  64   78

リストと同様に、データフレームの列を参照することができます。$で列名を指定すれば、その列のベクトルが返され、["列名"]の形式で列名を指定すれば、1列のデータフレームとして結果が返されます。

pacific_seiseki$win
## [1] 82 74 74 73 66 64
pacific_seiseki["lose"]
##   lose
## 1   59
## 2   66
## 3   68
## 4   69
## 5   73
## 6   78

リストと異なる点は、行列の要素と同様の参照が利用できることです。

# 要素の参照
pacific_seiseki[2, 3]
## [1] 66
# 行の参照
pacific_seiseki[4, ]
##        pacific win lose
## 4 ソフトバンク  73   69
# 列の参照
pacific_seiseki[, 3]
## [1] 59 66 68 69 73 78
# 複数列の参照: 2列目から3列目
pacific_seiseki[, 2:3]
##   win lose
## 1  82   59
## 2  74   66
## 3  74   68
## 4  73   69
## 5  66   73
## 6  64   78
# 複数列の参照: 1列目と3列目
pacific_seiseki[, c(1, 3)]
##        pacific lose
## 1         楽天   59
## 2         西武   66
## 3       ロッテ   68
## 4 ソフトバンク   69
## 5   オリックス   73
## 6     日本ハム   78

データフレームの行数と列数は以下のようにして確認することができます。

# 行数
nrow(pacific_seiseki)
## [1] 6
# 列数
ncol(pacific_seiseki)
## [1] 3
# 同時に
dim(pacific_seiseki)
## [1] 6 3

RStudioを利用している場合、Environment Paneにオブジェクトの一覧が表示されますが、その中でデータフレームのオブジェクトをクリックすると、スプレッドシートの形式で、データのプレビューが表示され、簡易的なデータの検索やソートができます。

1.5.1 外部データのデータフレームへのインポート

これまでは、Rの基本的な説明のために、ベクトルやデータフレームのオブジェクトをコマンドで作成する方法を示してきましたが、実際の分析では既存の外部データをRにインポートすることが多いです。ここでは、CSVファイルをインポートする方法を紹介します。

fukuoka2015.csvは2015年の福岡県内市区町村の人口および世帯数のデータです。リンクをクリックするととブラウザでファイルの中身が表示されるので、作業ディレクトリ(プロジェクトフォルダの場所)に「data」というフォルダを作成して、その中に保存しておいてください(右クリック->「名前を付けて保存」)。CSVファイルをデータフレームとしてインポートするには、read.csv()関数を用います。

fukuoka2015 <- read.csv("./data/fukuoka2015.csv", encoding = "UTF-8")
# データフレームの最初の6行を表示
head(fukuoka2015)
##   area_code     地域 総面積 人口総数 昼間人口 世帯数
## 1     40101   門司区   7367    99637    97946  43082
## 2     40103   若松区   7131    82844    82591  33692
## 3     40105   戸畑区   1661    59116    70519  27797
## 4     40106 小倉北区   3923   181878   224589  91253
## 5     40107 小倉南区  17174   212850   190913  88497
## 6     40108 八幡東区   3626    68844    73391  31442

encoding引数に、読み込むファイルの文字コード(このファイルの場合UTF-8)を指定します。この引数を指定しない場合、システム標準の文字コード(Windowsの場合SHIFT-JIS、Macの場合UTF-8)で読み込まれます。ファイルの文字コードと読み込もうとする文字コードに相違がある場合、文字化けが発生します。UTF-8のファイルを読み込む場合、Macの環境では、encoding引数の指定は必要ありません。

特に引数を指定しない場合、csvファイルの中で、数値のみからなるの列は数値型、それ以外は文字型として読み込まれます。fukuoka2015の場合、area_codeはコード番号を表すので名義尺度ですが、数値型として読み込まれるので、必要に応じて因子型に変換します。また、地域は文字型として読み込まれるので、こちらも必要に応じて因子型に変換します(後述)。

str(fukuoka2015)
## 'data.frame':    68 obs. of  6 variables:
##  $ area_code: int  40101 40103 40105 40106 40107 40108 40109 40131 40132 40133 ...
##  $ 地域     : chr  "門司区" "若松区" "戸畑区" "小倉北区" ...
##  $ 総面積   : int  7367 7131 1661 3923 17174 3626 8313 6936 3163 1540 ...
##  $ 人口総数 : int  99637 82844 59116 181878 212850 68844 256117 306015 228441 192688 ...
##  $ 昼間人口 : int  97946 82591 70519 224589 190913 73391 243568 303352 381926 296992 ...
##  $ 世帯数   : int  43082 33692 27797 91253 88497 31442 110562 141682 138832 116186 ...