reshapeでピボットテーブル
の編集
http://www.okadajp.org/RWiki/?reshape%E3%81%A7%E3%83%94%E3%83%9C%E3%83%83%E3%83%88%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
目次 #contents ---- *COLOR(Blue){SIZE(12){目的}} [#g0ddfe83] COLOR(RED){(注)reshape()関数とは違いますので、お気をつけください。}~ あなたはExcelのピボットテーブルを使ったことはありますか?結構便利ですよね。~ 実はreshapeパッケージを使うとRでExcelのピボットテーブルのようなものが簡単に作成できます。~ 現場で、大量のデータを扱っている皆さんはご存知だと思いますが、統計本に載っているような「正規化されたテーブル」なんて、ほとんど無いのが実情です。~ [非正規化テーブル]=>(四苦八苦)=>[正規化テーブル]=>[ようやく統計解析] さあ、AccessやSQLで正規化されたテーブルを作るのに四苦八苦している皆さん、Rのreshapeを使いましょう。~ 作者:Hadley Wickham:(http://had.co.nz/reshape )~ インストール:CRANからインストールできます。~ 簡単な解説:http://had.co.nz/reshape/introduction.pdf~ スライド:http://had.co.nz/reshape/presentation-dsc2005.pdf *COLOR(Red){SIZE(12){コメント欄}} [#n144f2cf] #comment(below) - コメント欄設けました。 -- &new{2007-06-22 (金) 09:22:33}; *COLOR(Blue){SIZE(12){2つのテーブル構造の変換(CastとMelt)}} [#g0ddfe83] Table.Aは、リレーショナルデータベースなどで良く利用されていデータ保存用のテーブルの形で、正規化されていません(MultiValue非正規化テーブル)。~ Table.Bは、統計で利用されるテーブルの形(正規化テーブル)です。~ データベースからデータを抽出する段階で、SQL文を使って正規化する方法もありますが、結構面倒臭いものです。~ reshapeパッケージでは、基本的にCastとMeltの2つのメソッドを使ってテーブル構造の変換を行います。 #ref(reshapeでピボットテーブル/reshape.PNG)~ **COLOR(Blue){SIZE(12){例題1:通常のテーブル構造変換}} [#g0ddfe83] code library(reshape) subject<-c("John Smith","John Smith","John Smith","Mary Smith") time<-c(1,1,1,1) variable<-c("age","weight","height","height") value<-c(33,90,2,2) x<-data.frame(subject=subject,time=time,variable=variable,value=value) x str(x) #テーブル構造変換(cast) y<-cast(x) y #list型になってるので str(y) #dataframeに変換 y<-data.frame(y) str(y) #テーブル構造変換(melt)--もとに戻す melt(y,id=c("subject","time")) #NAが入った構造 melt(y,id=c("subject","time"),preserve.na=FALSE) #NAを取り除く z<-melt(y,id=c("subject","time"),preserve.na=FALSE) str(z) #テーブルの並べ替え z<-z[order(z$subject),] #最初とちょっと並びが違うがこれでよし z 実行結果 > library(reshape) > subject<-c("John Smith","John Smith","John Smith","Mary Smith") > time<-c(1,1,1,1) > variable<-c("age","weight","height","height") > value<-c(33,90,2,2) > x<-data.frame(subject=subject,time=time,variable=variable,value=value) > x subject time variable value 1 John Smith 1 age 33 2 John Smith 1 weight 90 3 John Smith 1 height 2 4 Mary Smith 1 height 2 > str(x) 'data.frame': 4 obs. of 4 variables: $ subject : Factor w/ 2 levels "John Smith","Mary Smith": 1 1 1 2 $ time : num 1 1 1 1 $ variable: Factor w/ 3 levels "age","height",..: 1 3 2 2 $ value : num 33 90 2 2 注1)dataframeのnameは必ず小文字にすること。大文字が入るとうまくいかない。~ 注2)横展開項目名には、必ず variable と value を使うこと~ subject,time=縦展開行データ、variable=横展開列名、value=横展開列内のデータ > y<-cast(x) > y subject time age height weight 1 John Smith 1 33 2 90 2 Mary Smith 1 NA 2 NA 変換終了 > str(y) List of 5 $ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 $ time : num [1:2] 1 1 $ age : num [1:2] 33 NA $ height : num [1:2] 2 2 $ weight : num [1:2] 90 NA - attr(*, "row.names")= chr [1:2] "1" "2" - attr(*, "idvars")= chr [1:2] "subject" "time" - attr(*, "rdimnames")=List of 2 ..$ :'data.frame': 2 obs. of 2 variables: .. ..$ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 .. ..$ time : num [1:2] 1 1 ..$ :'data.frame': 3 obs. of 1 variable: .. ..$ variable: Factor w/ 3 levels "age","height",..: 1 2 3 list型になってるので、dataframeに変換する(後の処理で必要なので) > y<-data.frame(y) > str(y) 'data.frame': 2 obs. of 5 variables: $ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 $ time : num 1 1 $ age : num 33 NA $ height : num 2 2 $ weight : num 90 NA dataframeになった。次に元の形に戻す > melt(y,id=c("subject","time")) subject time variable value 1 John Smith 1 age 33 2 Mary Smith 1 age NA 3 John Smith 1 height 2 4 Mary Smith 1 height 2 5 John Smith 1 weight 90 6 Mary Smith 1 weight NA NAが入ったのでNAを取り除く(考えようによっては、NA入りのデータのほうが正しい) > melt(y,id=c("subject","time"),preserve.na=FALSE) subject time variable value 1 John Smith 1 age 33 2 John Smith 1 height 2 3 Mary Smith 1 height 2 4 John Smith 1 weight 90 これで取り除けたが、並びがよくない > z<-melt(y,id=c("subject","time"),preserve.na=FALSE) > str(z) 'data.frame': 4 obs. of 4 variables: $ subject : Factor w/ 2 levels "John Smith","Mary Smith": 1 1 2 1 $ time : num 1 1 1 1 $ variable: Factor w/ 3 levels "age","height",..: 1 2 2 3 $ value : num 33 2 2 90 並びを変更 > z<-z[order(z$subject),] > z subject time variable value 1 John Smith 1 age 33 2 John Smith 1 height 2 4 John Smith 1 weight 90 3 Mary Smith 1 height 2 > とりあえず良し **COLOR(Blue){SIZE(12){例題2:重複値が存在した場合のテーブル構造変換}} [#g0ddfe83] code library(reshape) subject<-c("John Smith","John Smith","John Smith","John Smith","Mary Smith") time<-c(1,1,1,1,1) variable<-c("age","weight","weight","height","height") value<-c(33,90,88,2,2) x<-data.frame(subject=subject,time=time,variable=variable,value=value) x cast(x) cast(x,fun.aggregate=mean) 実行結果 > library(reshape) > subject<-c("John Smith","John Smith","John Smith","John Smith","Mary Smith") > time<-c(1,1,1,1,1) > variable<-c("age","weight","weight","height","height") > value<-c(33,90,88,2,2) > x<-data.frame(subject=subject,time=time,variable=variable,value=value) > x subject time variable value 1 John Smith 1 age 33 2 John Smith 1 weight 90 3 John Smith 1 weight 88 4 John Smith 1 height 2 5 Mary Smith 1 height 2 2,3レコードが重複している > cast(x) subject time age height weight 1 John Smith 1 1 1 2 2 Mary Smith 1 NA 1 NA Warning message: Aggregation requires fun.aggregate: length used as default ワーニングメッセージで、複数値を持ってるのでfun.aggregateを使えと。lengthで勝手に集計したらこうなってますよ、weightが2レコードありますよ。 > cast(x,fun.aggregate=mean) subject time age height weight 1 John Smith 1 33 2 89 2 Mary Smith 1 NA 2 NA fun.aggregate=mean平均値にしてくださいと指定した。weightに89が入っている~ (注)fun.aggregateで使える集計値は、summary()で使えるものとのこと。~ min,max,mean,median,length, var, sd, range, fivenum, quantile, などなどたくさん(要するに単変量統計関数ならなんでものはず) *アクセス数: [#ef4c8adc] &counter; 人
タイムスタンプを変更しない
目次 #contents ---- *COLOR(Blue){SIZE(12){目的}} [#g0ddfe83] COLOR(RED){(注)reshape()関数とは違いますので、お気をつけください。}~ あなたはExcelのピボットテーブルを使ったことはありますか?結構便利ですよね。~ 実はreshapeパッケージを使うとRでExcelのピボットテーブルのようなものが簡単に作成できます。~ 現場で、大量のデータを扱っている皆さんはご存知だと思いますが、統計本に載っているような「正規化されたテーブル」なんて、ほとんど無いのが実情です。~ [非正規化テーブル]=>(四苦八苦)=>[正規化テーブル]=>[ようやく統計解析] さあ、AccessやSQLで正規化されたテーブルを作るのに四苦八苦している皆さん、Rのreshapeを使いましょう。~ 作者:Hadley Wickham:(http://had.co.nz/reshape )~ インストール:CRANからインストールできます。~ 簡単な解説:http://had.co.nz/reshape/introduction.pdf~ スライド:http://had.co.nz/reshape/presentation-dsc2005.pdf *COLOR(Red){SIZE(12){コメント欄}} [#n144f2cf] #comment(below) - コメント欄設けました。 -- &new{2007-06-22 (金) 09:22:33}; *COLOR(Blue){SIZE(12){2つのテーブル構造の変換(CastとMelt)}} [#g0ddfe83] Table.Aは、リレーショナルデータベースなどで良く利用されていデータ保存用のテーブルの形で、正規化されていません(MultiValue非正規化テーブル)。~ Table.Bは、統計で利用されるテーブルの形(正規化テーブル)です。~ データベースからデータを抽出する段階で、SQL文を使って正規化する方法もありますが、結構面倒臭いものです。~ reshapeパッケージでは、基本的にCastとMeltの2つのメソッドを使ってテーブル構造の変換を行います。 #ref(reshapeでピボットテーブル/reshape.PNG)~ **COLOR(Blue){SIZE(12){例題1:通常のテーブル構造変換}} [#g0ddfe83] code library(reshape) subject<-c("John Smith","John Smith","John Smith","Mary Smith") time<-c(1,1,1,1) variable<-c("age","weight","height","height") value<-c(33,90,2,2) x<-data.frame(subject=subject,time=time,variable=variable,value=value) x str(x) #テーブル構造変換(cast) y<-cast(x) y #list型になってるので str(y) #dataframeに変換 y<-data.frame(y) str(y) #テーブル構造変換(melt)--もとに戻す melt(y,id=c("subject","time")) #NAが入った構造 melt(y,id=c("subject","time"),preserve.na=FALSE) #NAを取り除く z<-melt(y,id=c("subject","time"),preserve.na=FALSE) str(z) #テーブルの並べ替え z<-z[order(z$subject),] #最初とちょっと並びが違うがこれでよし z 実行結果 > library(reshape) > subject<-c("John Smith","John Smith","John Smith","Mary Smith") > time<-c(1,1,1,1) > variable<-c("age","weight","height","height") > value<-c(33,90,2,2) > x<-data.frame(subject=subject,time=time,variable=variable,value=value) > x subject time variable value 1 John Smith 1 age 33 2 John Smith 1 weight 90 3 John Smith 1 height 2 4 Mary Smith 1 height 2 > str(x) 'data.frame': 4 obs. of 4 variables: $ subject : Factor w/ 2 levels "John Smith","Mary Smith": 1 1 1 2 $ time : num 1 1 1 1 $ variable: Factor w/ 3 levels "age","height",..: 1 3 2 2 $ value : num 33 90 2 2 注1)dataframeのnameは必ず小文字にすること。大文字が入るとうまくいかない。~ 注2)横展開項目名には、必ず variable と value を使うこと~ subject,time=縦展開行データ、variable=横展開列名、value=横展開列内のデータ > y<-cast(x) > y subject time age height weight 1 John Smith 1 33 2 90 2 Mary Smith 1 NA 2 NA 変換終了 > str(y) List of 5 $ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 $ time : num [1:2] 1 1 $ age : num [1:2] 33 NA $ height : num [1:2] 2 2 $ weight : num [1:2] 90 NA - attr(*, "row.names")= chr [1:2] "1" "2" - attr(*, "idvars")= chr [1:2] "subject" "time" - attr(*, "rdimnames")=List of 2 ..$ :'data.frame': 2 obs. of 2 variables: .. ..$ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 .. ..$ time : num [1:2] 1 1 ..$ :'data.frame': 3 obs. of 1 variable: .. ..$ variable: Factor w/ 3 levels "age","height",..: 1 2 3 list型になってるので、dataframeに変換する(後の処理で必要なので) > y<-data.frame(y) > str(y) 'data.frame': 2 obs. of 5 variables: $ subject: Factor w/ 2 levels "John Smith","Mary Smith": 1 2 $ time : num 1 1 $ age : num 33 NA $ height : num 2 2 $ weight : num 90 NA dataframeになった。次に元の形に戻す > melt(y,id=c("subject","time")) subject time variable value 1 John Smith 1 age 33 2 Mary Smith 1 age NA 3 John Smith 1 height 2 4 Mary Smith 1 height 2 5 John Smith 1 weight 90 6 Mary Smith 1 weight NA NAが入ったのでNAを取り除く(考えようによっては、NA入りのデータのほうが正しい) > melt(y,id=c("subject","time"),preserve.na=FALSE) subject time variable value 1 John Smith 1 age 33 2 John Smith 1 height 2 3 Mary Smith 1 height 2 4 John Smith 1 weight 90 これで取り除けたが、並びがよくない > z<-melt(y,id=c("subject","time"),preserve.na=FALSE) > str(z) 'data.frame': 4 obs. of 4 variables: $ subject : Factor w/ 2 levels "John Smith","Mary Smith": 1 1 2 1 $ time : num 1 1 1 1 $ variable: Factor w/ 3 levels "age","height",..: 1 2 2 3 $ value : num 33 2 2 90 並びを変更 > z<-z[order(z$subject),] > z subject time variable value 1 John Smith 1 age 33 2 John Smith 1 height 2 4 John Smith 1 weight 90 3 Mary Smith 1 height 2 > とりあえず良し **COLOR(Blue){SIZE(12){例題2:重複値が存在した場合のテーブル構造変換}} [#g0ddfe83] code library(reshape) subject<-c("John Smith","John Smith","John Smith","John Smith","Mary Smith") time<-c(1,1,1,1,1) variable<-c("age","weight","weight","height","height") value<-c(33,90,88,2,2) x<-data.frame(subject=subject,time=time,variable=variable,value=value) x cast(x) cast(x,fun.aggregate=mean) 実行結果 > library(reshape) > subject<-c("John Smith","John Smith","John Smith","John Smith","Mary Smith") > time<-c(1,1,1,1,1) > variable<-c("age","weight","weight","height","height") > value<-c(33,90,88,2,2) > x<-data.frame(subject=subject,time=time,variable=variable,value=value) > x subject time variable value 1 John Smith 1 age 33 2 John Smith 1 weight 90 3 John Smith 1 weight 88 4 John Smith 1 height 2 5 Mary Smith 1 height 2 2,3レコードが重複している > cast(x) subject time age height weight 1 John Smith 1 1 1 2 2 Mary Smith 1 NA 1 NA Warning message: Aggregation requires fun.aggregate: length used as default ワーニングメッセージで、複数値を持ってるのでfun.aggregateを使えと。lengthで勝手に集計したらこうなってますよ、weightが2レコードありますよ。 > cast(x,fun.aggregate=mean) subject time age height weight 1 John Smith 1 33 2 89 2 Mary Smith 1 NA 2 NA fun.aggregate=mean平均値にしてくださいと指定した。weightに89が入っている~ (注)fun.aggregateで使える集計値は、summary()で使えるものとのこと。~ min,max,mean,median,length, var, sd, range, fivenum, quantile, などなどたくさん(要するに単変量統計関数ならなんでものはず) *アクセス数: [#ef4c8adc] &counter; 人
テキスト整形のルールを表示する
添付ファイル:
reshape.PNG
2953件
[
詳細
]