Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

第73回 データの整形に関する備忘録

個人的には重要なのにすぐ忘れるので、データの整形に関する備忘録。

□データフレームの操作

□因子の順序を変更

> sizes <- factor(c("small", "large", "large", "small", "medium”))

> sizes.sml <- factor(sizes, levels = c("small", "medium", "large”))

 #レベルを逆転させるにはrev()関数を利用

「sizes」の中のレベルを「small」「medium」「large」というレベルにする。 

f:id:teruaki-sugiura:20160117014125p:plain

□データの大小に応じて因子の順序を変更

> IS$spray <- reorder(IS$spray, IS$count, mean)

「IS」データフレームのレベルを「spray」毎に「count」のグループ「平均」を基準にレベルをつける。

f:id:teruaki-sugiura:20160117014152p:plain

□ファクタのレベル名を変更

> sizes1 <- revalue(sizes, c(small = "s", medium = "m", large = "l"))

revalue()を用います。変更前=”変更後”というように指定します。

f:id:teruaki-sugiura:20160117014216p:plain

□カテゴリカル変数を別のカテゴリカル変数に変更

> oldvals <- c("ctrl", "trt1", "trt2”) #変更前のラベル

> newvals <- factor(c("No", "uhh", "Yes”)) #変更後のラベル

> pg$treatment <- newvals[ match(pg$group, oldvals)]

データフレームの「pg」に変数「treatment」として、「group」と「oldvals」をmatch()関数でラベル変更を行う。

f:id:teruaki-sugiura:20160117014237p:plain

以下でも同じ。

> pg$treatment[pg$group == "ctrl"] <- "no"

> pg$treatment[pg$group == "trt1"] <- "uhh"

> pg$treatment[pg$group == "trt2"] <- "yes"

#pg$treatment[pg$group == “ctrl” & pg$weight < 5] <- “no_small”

 というように演算子を用いれば、詳細にラベル分けできる。

f:id:teruaki-sugiura:20160117014250p:plain

□連続値変数をカテゴリカル変数に変更

> pg$wtclass <- cut(pg$weight, breaks = c(0, 5, 6, Inf))

データフレームの「pg」の変数「weight」の連続値変数を「breaks=c()」で指定した4つの区切りで分割する。cut()の結果はファクタとなる。

#labels = c("small", "medium", "large”)を指定すれば、そのままラベル変更できる。

#(a, b] = {x | a < x <= b}です。左開右閉区間

f:id:teruaki-sugiura:20160117014311p:plain

□グループ毎に変数を変換する

> cb <- ddply(cabbages, "Cult", transform, DevWt = HeadWt - mean(HeadWt))

「Cult(c39とc52)」で示されるグループで、各グループで平均からの各行の偏差を求め、グループ毎に正規化できる。

「Cult(c39とc52)」と2つのデータフレームに分割し、各データフレームにtransform()以降に適用される。

f:id:teruaki-sugiura:20160117014329p:plain

> cb <- transform(cabbages, DevWt = HeadWt - mean(HeadWt))

この場合だと、2つのデータフレームに分割せずに正規化していることになる。

f:id:teruaki-sugiura:20160117014341p:plain

> cb <- ddply(cabbages, c("Cult", "Date"), transform, DevWt = HeadWt - mean(HeadWt), DevVitC = VitC - mean(VitC))

「Cult(c39とc52)」と「Date(d16, d20, d21)」でデータフレームを分割し、複数の変数に対して、transform()以降の操作が適用される。

つまり、(c39, d16)(c39, d20)(c39, d21)(c52, d16)(c52, d20)(c52, d21)の組み合わせごとに正規化します。 

f:id:teruaki-sugiura:20160117014353p:plain

> cb <- ddply(cb, c("Cult", "Date"), transform, HeadWt_mean = mean(HeadWt, na.rm=TRUE), VitC_mean = mean(VitC, na.rm=TRUE))

これであれば、(c39, d16)(c39, d20)(c39, d21)(c52, d16)(c52, d20)(c52, d21)の平均値を新たな列として追加できる。

f:id:teruaki-sugiura:20160117014432p:plain

> ddply(cabbages, c("Cult", "Date"), summarise, Weight = mean(HeadWt), VitC = mean(VitC))

summarise()であれば、各組み合わせの平均値を要約できる。

f:id:teruaki-sugiura:20160117014444p:plain

> ddply(cabbages, c("Cult", "Date"), summarise, Weight.sd = sd(HeadWt), n = length(VitC))

f:id:teruaki-sugiura:20160117014500p:plain

広告を非表示にする