reshapeでピボットテーブル
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
目次
#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;
人
ページ名: