44. データの加工と抽出


データの加工と抽出に関する関数一覧

データ加工に関する関数の一覧はこちら(以下に出てくる x はデータフレームとする).

コマンド

機能

head(x, n=a)

先頭から a 行だけ抽出する.関数 tail(x, n=b) で末尾から b 行だけ抽出する.

na.omit(x)

NA を含む行を削除する.関数 na.exclude() も似た様な関数である.

transform(x, y=値)

データフレーム x に新たな列 y を追加する.

x[sapply(x, 論理ベクトル)]

論理ベクトルが TRUE となっている行にのみアクセスする.例えば x[sapply(x, is.numeric)] ならば数値データにのみアクセスする.

subset(x, 条件式)

条件式に合う行のみを抽出する.
例えば subset(x, id>3) ならば id > 3 となる行のみを抽出する.

subset(x, 条件式, ベクトル)

ベクトルで指定した列に対し,条件式に合う行のみを抽出する.
例えば subset(x, id>3, c(id,sex)) ならば id > 3 となる "id" と "sex" だけを抽出する.

split(x, 列名や条件式)

列がカテゴリーデータならば列名でデータフレームを分割する.条件式でデータフレームを分割することも出来る(例:split(x, x$w==70) ).

by(x, x\$列名, mean)

データ x を層別して平均を求める.mean を別の関数に変えても良い.関数 aggregate() も似た機能を持つ関数である.

reshape(x, ...)

データフレームを横に展開する.

データの加工例

まず,データフレーム DF を作成する.

 
 id  <- c(  1,  2,  3,  4,  5)               # ID
 sex <- c("F","F","M","M","M")               # 性別(F:女,M:男)
 h   <- c(158,162,177,173,166)               # 身長
 w   <- c( 51, 55, 72, 57, 64)               # 体重
 DF  <- data.frame(ID=id, SEX=sex, H=h, W=w)

 データフレーム DF

 
  ID SEX   H  W
1  1   F 158 51
2  2   F 162 55
3  3   M 177 72
4  4   M 173 57
5  5   M 166 64

データフレーム DF の体重(W)の列だけを足し算したい場合は以下のように列ラベルを指定し,それごと関数 sum() に放り込んでやればよい.また,体重の単位を g(グラム)に変換する場合は,体重(W)の列を 1000 倍したものをデータフレームに代入してやればよい.

 
 sum(DF$W)                        # 体重の和を求める
 DF$W <- DF$W * 1000              # 体重の単位を kg から g に変換する
 DF

  ID SEX   H     W
1  1   F 158 51000
2  2   F 162 55000
..................

DF に新たな変数 G を追加する場合は,関数 transform() を使うか,単に代入すればよい.

 
 transform(DF, G=DF$W * 1000 )    # DF$G <- DF$W * 1000 でも可

  ID SEX   H  W     G
1  1   F 158 51 51000
2  2   F 162 55 55000
.................... 

条件に当てはまる行のみに処理を施す場合は,関数 ifelse(条件式, TRUE の場合に返す値, FALSE の場合に返す値) を用いる.

 
 DF$W <- ifelse(DF$SEX=="F", NA, DF$W)  # 女性の体重を隠す(NAに)
 DF

  ID SEX   H  W
1  1   F 158 NA
2  2   F 162 NA
3  3   M 177 72
...............

条件に当てはまるものだけを抽出する場合は,条件式をデータフレームの [ ] などで指定すればよい.

 
 cond <- (DF$H >= 170)            # 身長(H)が 170cm 以上の人を抽出
 DF[cond,]

  ID SEX   H  W
3  3   M 177 72
4  4   M 173 57

関数 subset() や関数 sapply() を用いても,条件に当てはまるものだけを抽出することが出来る.

 
 subset(DF, ID>3)                 # ID > 3 となる行

  ID SEX   H  W
4  4   M 173 57
5  5   M 166 64

 subset(DF, ID>3, c(ID, SEX))     # ID > 3 となる "ID" と "SEX" のみ

  ID SEX
4  4   M
5  5   M

整数データをカテゴリ変数と認識させる場合は関数 as.factor() で変換すればよく,「順序変数宣言を行う場合は as.ordered(A$id)」「量的変数宣言を行う場合は as.single(A$w)」とすればよい. 

 
 DF$ID <- as.factor(DF$ID)        # データを見ても変換されたかどうかが分からない
 DF[sapply(DF, is.numeric)]       # 数値変数だけを選択

    H  W
1 158 NA
2 162 NA
........

ID を固定し,SEX(性別)で場合分けしてデータを横に展開する場合は関数 reshape() を用いる.

 
 reshape(DF, timevar="SEX", idvar="ID", direction="wide")

  ID H.F W.F H.M W.M    # H.F:女性の身長,W.F:女性の体重,H.M:男性の体重,W.M:男性の体重
1  1 158  51  NA  NA
2  2 162  55  NA  NA
3  3  NA  NA 177  72
4  4  NA  NA 173  57
5  5  NA  NA 166  64