データの再整形
reshape: [動](他)(自)(…を)作り直す[変える], 新しい形にする (goo辞書)
転置
t(): 行列またはデータフレームの行と列を入れ替える。
# 組み込みデータセットmatcars
head(mtcars)
head(t(mtcars))
reshape パッケージ
reshape パッケージのn 入門 、 論文 、 紹介動画。Rjpwikiの記事。
作者Wickhamのウェブサイト。reshape2があるが、cast関数が無くなっている。集計用のacast (配列用) 、dcast (データフレーム用) のは覚えると使いやすそうだけど...
- melt: 横長データを縦長にする
- cast: 縦長データを横長にする
# 使用例。横長データ
id <- c(1,1,2,2)
time <- c(1,2,1,2)
x1 <- c(5,3,6,2)
x2 <- c(6,5,1,4)
dat <- data.frame(id, time, x1, x2)
dat
# melt関数で縦長にする。
# 縦にしておきたい変数をid=で指定する。それ以外の変数は"variable"という変数の水準として縦に並び、数値は"value"という変数に並べられる。
library(reshape)
mdat <- melt(dat, id=c("id", "time"))
mdat
# cast関数でまた横長にする。
# 縦にしておきたい変数をid=で指定する。水準名を横にしたい変数は事前に変数名を"variable"にしておく。また、数値の入っている変数名は"value"にしておく。
cdat <- cast(mdat, id=c("id", "time"))
cdat
cast関数を集計用として使う
# cast(data, formula, function) 。常にvalue変数が集計対象
mdat # データ確認
cast(mdat, ~id, mean) # 被験者 (id) ごとの平均
cast(mdat, ~time, mean) # time変数ごとの平均
cast(mdat, ~variable, mean) # variable変数 (x1, x2..) ごとの平均
cast(mdat, id~variable, mean) # 被験者xvariable ごとの平均
cast(mdat, variable~id, mean) # variable (行) x 被験者 (列) ごとの平均
cast(mdat, id~time, mean) # 被験者xtime ごとの平均
データの中央値分割
nx <- x
nx[x >= median(x)] <- "high"
nx[x < median(x)] <- "low"
nx <- factor(nx)
summary(nx)
変数の中身をシャッフルする・ランダムに並べ替える
x <- gl(6, 5, labels=c("G", "T", "D", "C", "B", "S"))
x
x[order(rnorm(length(x)))]
横長データフレームのを水準ごとに分割
# 2要因分散分析で事後検定をするときなんかに使う (かもしれない) 。
# サンプルデータ
dat <- data.frame(matrix(sample(10:99, 120, replace=T), nr=10))
names(dat) <- c("a1b1", "a1b2", "a1b3", "a1b4", "a2b1", "a2b2", "a2b3", "a2b4", "a3b1", "a3b2", "a3b3", "a4b4")
dat
nlva <- 3 # 自分で入力
nlvb <- 4 # 自分で入力
anms <- c("a1", "a2", "a3") # 自分で入力
bnms <- c("b1", "b2", "b3", "b4") # 自分で入力
ncl <- ncol(dat)
clnm <- 1:ncl
clmt <- matrix(clnm, nlvb)
adatlist <- list()
bdatlist <- list()
# a要因のデータ作成
for (i in 1:nlva) {
x <- dat[clmt[,i]] ; names(x) <- bnms
adatlist[[i]] <- x
}
names(adatlist) <- anms
# b要因のデータ作成
for (i in 1:nlvb) {
x <- dat[clmt[i,]] ; names(x) <- anms
bdatlist[[i]] <- x
}
names(bdatlist) <- bnms
dat
adatlist
bdatlist