Rでのデータハンドリング


このページでは、Rでのデータの整形・加工・プログラミング(少しだけ)方法について説明します。


更新履歴:とりあえず移転(2011/2/13)
2011年2月13日からのアクセス数: -


データの構造

1個のデータの種類

ちょっとイメージしにくいかも知れませんが、1個のデータを取ってみても種類がいくつかあります。具体的には以下のようです。
  • 数字:numeric。1、3.5、-10など
  • 文字列:character。"Tekito"、"Darui"など。
  • 要因:factor。見た目は文字列っぽいのだが、水準(順位)が付いている。
  • 論理値:logical。TRUEまたはFALSE。
  • 欠損:NA。これが入っていると動作しない関数があるので要注意。
  • 非数:NaN。1/0とかやっちゃったりすると発生する。やっぱり関数の動作を妨げるので要注意。

データの塊の種類

と、一つ一つのデータに種類があるわけですが、それらの集まりに関しても種類があります。具体的には以下のようです。
  • ベクトル:c()。構造などがない一つながりのデータ。あらゆる種類のデータを含めるが、同一ベクトル内で異なった形式の値を混在させることはできない。むりくり異なった形式の値を混在させると、一番ランクの低い形式に合わされる。例えば、文字列が入っている場合は数字も文字列扱いになってしまう。
> test <- c(1, 2, "Tekito", TRUE)
> test
[1] "1" "2" "Tekito" "TRUE"
> test[1] + test[2]
Error in test[1] + test[2]
> 1 + 2
[1] 3
  • 行列:matrix()。行列(縦と横)の形があるデータ。数字以外は含めない。
  • データフレーム:data.frame()。見た目は行列だが、数字以外も含める。実用的には最も多用する形式。行や列のラベルあるいは番号で行や列を取り出せる。行数の違う列が混在することはできない。
  • リスト:list()。構造や並び方が違うデータも無理矢理一つにできる。自分で作ることはあんまり無いが、統計や作図関数の結果を返したオブジェクトはリストになっていることが多い。
とりあえずこうしてみると、現在読み込んでいるdはデータフレームですが、PlotやSpなど一つ一つの列は「ベクトル」と見なすことができます。


個々のデータの変換

データの生成

  • コロン(:):等差数列を生成する
  • r***:乱数を発生させる。正規分布はrnorm(データ数, 平均値, 分散)、二項分布はrbinom(データ数, 上限値, 生起確率)、ポアソン分布はrpois(データ数, ラムダ)。他にも色々。

1:10
[1]  1  2  3  4  5  6  7  8  9 10
5:(-4) #負の数ももちろんオッケー
[1]  5  4  3  2  1  0 -1 -2 -3 -4
1:10*10 #かけ算すれば、1以外の等差数列もできる
[1]  10  20  30  40  50  60  70  80  90 100
1 + 1:10*2 #工夫すればいろんな等差数列ができる
[1]  3  5  7  9 11 13 15 17 19 21

rnorm(100, 100, 10) #平均値100, 分散10の乱数を100個作る
rbinom(100, 1, 0.8) #生起確率が80%で、0または1を取る事象(成功と失敗、裏と表とか)を100回行う
rpois(100, 1) #ラムダ(平均値)が1のポアソン分布に従うデータを100個発生させる。

種類の変換

  • as.character():文字列に変換。要因として認識されてしまった数字の文字列を数字として認識させるときにも使う。
#ダミーデータの生成
> No <- as.factor(1:100*2)
> y <- rnorm(100, 10, 5)
> d <- data.frame(No, y)
> summary(d)
       No           y         
2      : 1   Min.   :-1.182  
4      : 1   1st Qu.: 6.782  
6      : 1   Median : 9.436  
8      : 1   Mean   : 9.604  
10     : 1   3rd Qu.:12.468  
12     : 1   Max.   :23.609  
(Other):94                
#Noは要因として認識されている
#これを単に数字にしようとすると、要因の「順番」の数字になってしまう
> as.numeric(d$No)
#このような数字を「見た目のまま」数字に変換するには、
> as.numeric(as.character(d$No))

  • as.numeric():数字に変換。作図でよく登場。
  • as.factor():要因に変換

NA処理

  • is.na():NAかどうかをTRUEまたはFALSEで回答
  • ifelse(条件式, TRUEの場合, FALSEの場合):条件式を与え、TRUEの場合とFALSE場合に異なる動作を行わせる。


データフレームの整形・加工

データフレーム同士の結合

  • cbind():データフレーム同士を横方向で結合
  • rbind():データフレーム同士を縦方向で結合
  • merge():2つのデータフレームに共通なデータに合わせる形で結合

データフレームの横または縦展開

  • reshape():データフレームを楯または横方向に展開する。具体例を見て下さい。

プログラミング

繰り返し命令

  • for():同じような動作を繰り返す時に使える。
  • split():データフレームをカテゴリーごとに


文字列処理

  • paste(, , sep=""):2つ以上の要素を、sep=で指定した文字列で区切って結合する(sep=""とすれば間に何も入らない)。
  • sub:
  • substring(文字列, 最初の位置, 終わりの位置):文字列を左から指定した位置で切り取る
最終更新:2012年04月07日 11:20