データの再整形

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