基本操作(データハンドリング)

前田和寛(@kazutan)
2015/5/23

Hijiyama.R #2

icon

自己紹介

所属

比治山大学短期大学部

Twitter

@kazutan

Web

http://kz-md.net/
http://blog.kz-md.net/

ビールのみてぇ

免責事項

ペース速いです

  • 量が多く、時間の制約上…
  • 「後から詰まった時に見直してもらう」というコンセプトで作っております

やり方はいろいろ

  • 今回は組み込み関数を中心に説明
  • いろんなパッケージを使うと色々捗る
    • でもそれは別ので…

今回の内容

  • データの読み込み
  • データフレーム要素へのアクセス
  • subset関数を使ってアクセス
  • データの操作
  • データフレームの結合

データの読み込み

データの読み込み(1)

CSVファイルからの読み込み

“data.csv"というファイルを読み込むなら…

x <- read.csv("data.csv")

一行目に変数名がある場合は自動で読み込みますが、うまく行かない時は…

x <- read.csv("data.csv", header = TRUE)
  • 最初の引数はファイル名(ファイルパス)

データの読み込み(2)

Excelフィアルからの読み込み

XLConnectパッケージが必要です

  # パッケージインストール
install.packages("XLConnect")
  # パッケージ読み込み
library(XLConnect)

  # ekusu.xlsxの一つ目のシートを読み込む
x <- readWorksheetFromFile("ekusu.xlsx", sheet = 1)

でも正直なところ、csvファイルに落としこんで読み込んだほうがいいですよ

データの読み込み(3)

クリップボードから読み込む(Windows)

あらかじめExcelなどで読み込ませたいデータをコピーして…

x <- read.table("clipboard", header = TRUE)
  • 先頭行が変数名ではない場合は、header = FALSE
  • Linuxでも同じコマンドで行けますが、日本語が混じると文字コード問題が発生します
  • Macの場合は以下のコードを実行
x <- read.table(pipe('pbpaste'), header = TRUE)

データの読み込み(4)

GUIでファイルを選択

(1)で指定したファイル名を以下のように変更

x <- read.csv(file.choose())
  • 実行すると、ファイルを選択するダイアログボックスが出てきます
  • 要するに「ファイル名をGUIで選択して、file.choose()の場所に放り込む」ことをしてます

データフレームの要素へのアクセス

データフレームの要素へアクセス(0)

これが基本かつ重要

  • データハンドリングは「操作したいターゲットを指定」が第一歩
    • 操作したいターゲットを指定可能→あとはそれを処理すればいい
    • 逆にこれができないと何もできない
    • Rで最初につまづくポイント
  • ここからはRに組み込まれているirisデータを使っていきます

データフレームの要素へアクセス(1)

行番号・列番号を使ったアクセス

行番号を指定したアクセス

iris[3,]  #3行目(全部)にアクセス
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
3          4.7         3.2          1.3         0.2  setosa

列番号を指定したアクセス(最初の5行だけ)

head(iris[,2],5)  #irisの2列目にアクセス
[1] 3.5 3.0 3.2 3.1 3.6

データフレーム要素へのアクセス(2)

複数の行番号(や列番号)へのアクセス

iris[21:24,]  #21行目から24行目へのアクセス
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
21          5.4         3.4          1.7         0.2  setosa
22          5.1         3.7          1.5         0.4  setosa
23          4.6         3.6          1.0         0.2  setosa
24          5.1         3.3          1.7         0.5  setosa

データフレーム要素へのアクセス(3)

行番号と列番号を指定してアクセス

iris[21:24,1:3]  #21-24行目の1-3列目へのアクセス
   Sepal.Length Sepal.Width Petal.Length
21          5.4         3.4          1.7
22          5.1         3.7          1.5
23          4.6         3.6          1.0
24          5.1         3.3          1.7

データフレーム要素へのアクセス(4)

ある列(番号)を除外してアクセス

iris[21:24,-5]  #21-24行目から、5列目を除外
   Sepal.Length Sepal.Width Petal.Length Petal.Width
21          5.4         3.4          1.7         0.2
22          5.1         3.7          1.5         0.4
23          4.6         3.6          1.0         0.2
24          5.1         3.3          1.7         0.5
  • マイナス記号をつけると「それは除外しろ」という意味に

データフレーム要素へのアクセス(5)

複数列(番号)を除外してアクセス

iris[21:24,-4:-5]  #21-24行目から4,5列目を除外
   Sepal.Length Sepal.Width Petal.Length
21          5.4         3.4          1.7
22          5.1         3.7          1.5
23          4.6         3.6          1.0
24          5.1         3.3          1.7
  • 応用するとこんなことも可能

データフレーム要素へのアクセス(6)

変数名(列名)を使ってアクセス

head(iris$Sepal.Width,3)
[1] 3.5 3.0 3.2
  • データフレーム名$変数名 で指定可能
  • もしデータフレーム内の変数リストがほしい時はこちら
ls(iris)  #iris内の変数(オブジェクト)リストを出力
[1] "Petal.Length" "Petal.Width"  "Sepal.Length" "Sepal.Width" 
[5] "Species"     

subset関数を使ってアクセス

subset関数を使ってアクセス(1)

selectオプションで列番号指定してアクセス

head(subset(iris, select = 2:3),3) #irisの2-3列
  Sepal.Width Petal.Length
1         3.5          1.4
2         3.0          1.4
3         3.2          1.3
  • subset関数はデータフレーム(行列)の列要素にききます
  • subset(データフレーム, select=対象列)でアクセス可能
    • 数値を指定すれば列番号
    • コロンでつなげば連番として処理

subset関数を使ってアクセス(2)

変数名(列名)を使ってアクセス

head(subset(iris,select = Sepal.Width),3)
  Sepal.Width
1         3.5
2         3.0
3         3.2
  • selectオプションに変数名をいれてもOK

subset関数を使ってアクセス(3)

複数の変数名(列名)を使ってアクセス

head(subset(iris, select = c(Sepal.Length,Sepal.Width)),3)
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
  • 複数列を変数名で指定したいときは、c関数で束ねよう
    • ここの本当のポイントは「selectオプションはベクトルでもOK」
    • 要するに「必要な変数名を何かで束ねてselectに送り込めばOK」

subset関数を使ってアクセス(4)

変数の並びを使ってアクセス

head(subset(iris, select = Sepal.Length:Petal.Length),3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
  • なんと変数名の並びでも指定可能
  • データフレームで並んでいる順にアクセス
    • Sepal.Lengthは1列目、Petal.Lengthは3列目
    • なので1列目から3列目にアクセス

subset関数を使ってアクセス(5)

除外する変数を指定

head(subset(iris,select = -c(Sepal.Length,Species)),2)
  Sepal.Width Petal.Length Petal.Width
1         3.5          1.4         0.2
2         3.0          1.4         0.2
  • selectで指定するものにマイナス記号をつければOK
    • 複数の場合は今回の例みたいにすれば可能

subset関数を使ってアクセス(6)

条件を指定してアクセス

subset(iris,select=2:3, subset=Sepal.Width>4.0)
   Sepal.Width Petal.Length
16         4.4          1.5
33         4.1          1.5
34         4.2          1.4
  • subset関数のsubsetオプションで、条件を指定すればOK
    • 今回だとSepal.Widthが4より大きいレコード(行)を抽出

データの操作

データの操作(1)

変数の変換(他の変数へ)

iris2 <- transform(iris, kazu=Sepal.Width+5)
head(iris2,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species kazu
1          5.1         3.5          1.4         0.2  setosa  8.5
2          4.9         3.0          1.4         0.2  setosa  8.0
3          4.7         3.2          1.3         0.2  setosa  8.2
  • transform関数で変数(列)の変換が可能
    • transform(データフレーム, 対象列=計算式)

データの操作(2)

変数の変換(更新)

先ほどのiris2データフレームを使います

iris2 <- transform(iris2, kazu=kazu^2)
head(iris2,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species  kazu
1          5.1         3.5          1.4         0.2  setosa 72.25
2          4.9         3.0          1.4         0.2  setosa 64.00
3          4.7         3.2          1.3         0.2  setosa 67.24
  • 対象列を既存の変数にするとその計算式で更新

データの操作(3)

欠損値がある行の除去

  • 下のデータxを使用
   x  y
1  1 11
2  2 12
3  3 NA
4 NA 14
5  5 15
  • 右上のコードを実行
x[complete.cases(x),]
  x  y
1 1 11
2 2 12
5 5 15
  • これを何かオブジェクトに入れればOK
  • 分析の際には、na.rmオプションで指定していく方法も

データの操作(4)

行和の算出

head(iris[,1:3],3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
head(rowSums(iris[,1:3]),3)
[1] 10.0  9.3  9.2
  • 複数項目の合計得点を算出する時に

データの操作(5)

行平均の算出

head(iris[,1:3],3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
head(rowMeans(iris[,1:3]),3)
[1] 3.333333 3.100000 3.066667
  • 使い方はrowSums関数と同一

データフレームの結合

データフレームの結合(0)

サンプル1: x

  a b  c
1 1 A 11
2 2 B 12
3 3 C 13

サンプル2: y

  a b  d
1 2 B 12
2 3 C 13
3 4 D 14

データフレームの結合(1)

両方に含まれる列をキーとして結合

merge(x,y)
  a b  c  d
1 2 B 12 12
2 3 C 13 13
  • xとyで共通する列(aとb)が一致する行のみを取り出す
    • xとyの片方しかない列は、それぞれ残る(列数が増える)

データフレームの結合(2)

両方を網羅して結合

merge(x,y,all=TRUE)
  a b  c  d
1 1 A 11 NA
2 2 B 12 12
3 3 C 13 13
4 4 D NA 14
  • 共通する列(aとb)をキーとして結合
    • データがないところにはNAが入る

(おまけ)データハンドリング特別コース

邪智暴虐なエクセル王を倒そう

  1. e-statのExcelデータを適当にダウンロード
  2. Excelで編集せずRのみでまともなデータセットに
  3. コードも含めて公開→ みんな幸せ!!

…でも正直パッケージなし(装備なし)だときついです

参考資料