KuboWeb top

更新: 2016-11-22 16:46:34

生態学のデータ解析 - reshape(data.frame)


[もくじ]


横長 → 縦長 (wide -> long) 

 > data.example # こういうデータがあったとする
    forest treatment spc.1 spc.2 spc.3 spc.4 spc.5 spc.6 spc.7 spc.8 spc.9
 1       A         x     7     4     3     3     5     2     4     6     6
 2       B         x     3     9     5     5     4     1     3     5     5
 3       C         x     2     5     7     4     6     2     7     5     2
 4       D         x     4     5     5     2     4     6     5     9     5
 5       A         y     9     7     9     7    12     5     4     8     4
 6       B         y     2     5     5     3     4     2     1     6     4
 7       C         y     3     3     4     7     4     6     4     7     8
 8       D         y     4     3     3     9     8     4     3     5     4
 9       A         z     5     4     4     2     3     7     4     9     5
 10      B         z     4     4     7     5     4     6     4     7     6
 11      C         z     0     8     7     5     3     5     4     4     7
 12      D         z     5     3     5     7     4     7     5     5     1
 > v.spc # こういう列名 vector をあらかじめ準備しとく
 [1] "spc.1" "spc.2" "spc.3" "spc.4" "spc.5" "spc.6" "spc.7" "spc.8" "spc.9"
  • これは必ずしも キー.数字 という形式でなくてもよく,キー.文字列 でも良い (例: spc.FagusC, spc.AcerM など)
 > de2 <- reshape(data.example, direction = "long", varying = v.spc)
 > de2 <- de2[, 1:4]
 > colnames(de2) <- c("forest", "treatment", "spc", "n")
 > de2 # reshape() によって「長いカタチ」に変換された data.example
      forest treatment spc  n
 1.1       A         x   1  7
 2.1       B         x   1  3
 3.1       C         x   1  2
 4.1       D         x   1  4
 5.1       A         y   1  9
 6.1       B         y   1  2
 7.1       C         y   1  3
 8.1       D         y   1  4
 9.1       A         z   1  5
 10.1      B         z   1  4
 11.1      C         z   1  0
 12.1      D         z   1  5
 1.2       A         x   2  4
 2.2       B         x   2  9
 3.2       C         x   2  5
 4.2       D         x   2  5
 5.2       A         y   2  7
 ... (以下略) ...

注意 

  • id という名の列があるとエラーがでる
    • 対策: reshape() のオプションで idvar = "idnew" などなにか id 以外の値を指定する
  • time という名の列が勝手に追加される
    • この名前を変えたければ reshape() のオプションで timevar = "xyz" というふうに名前を指定する
  • 縦長にした data.frame にデータをくっつけたければ,merge が便利
    • 例: de2 <- merge(de2, d.spc.data, by="spc")
    • help(merge) には使いかたの例がいろいろ示されています

縦長 → 横長 (long -> wide) 

> d # こういうデータがあったとする
  Plot Spc  y
1    1   A 52
2    1   B 31
3    2   A 27
4    2   B 15
> reshape(d, timevar= "Spc", idvar = "Plot", direction = "wide")
  Plot y.A y.B
1    1  52  31
3    2  27  15