読者です 読者をやめる 読者になる 読者になる

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

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

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

その他(R関係)

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

□データフレームの操作

□因子の順序を変更

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

広告を非表示にする