web-dev-qa-db-ja.com

tidyrのspread()が因子レベルを処理する方法

私は自分のデータを操作していて、プロセスのある時点で何か間違ったことをしたことに気づきました。この問題を調査したところ、問題はtidyrパッケージのspread()の次の動作に起因していました。

これが実証的な例です。次のようなデータフレームがあるとしましょう。

_> d <- data.frame(factor1 = rep(LETTERS[1:3], each = 3),
+   factor2 = rep(paste0("level", c(1, 2, 10)), 3),
+   num = 1:9
+ )  
> d
  factor1 factor2 num
1       A  level1   1
2       A  level2   2
3       A level10   3
4       B  level1   4
5       B  level2   5
6       B level10   6
7       C  level1   7
8       C  level2   8
9       C level10   9
_

私がやりたかったのは、この長いフォーマットのデータフレームをワイドフォーマットに変換することでした。そして、私はspread()が行く方法だと思いました。しかし、その結果は私が期待したものではありませんでした。

_> spread(d, factor2, num)
  factor1 level1 level2 level10
1       A      1      3       2
2       B      4      6       5
3       C      7      9       8
_

Factor1が "A"でfactor2が "level2"の場合、値は2になりますが、結果のワイドフォーマットは3になります。明らかに、numはfactor2のアルファベット順(level1> level10> level2)であり、ワイドフォーマット。ただし、そうである場合、factor2ラベルは、元のデータフレームに表示されるのと同じ順序を保持します(レベル1>レベル2>レベル10)。

なぜこれが起こるのか(および/または関連情報をどこで見つけることができるのか)誰かが説明できますか?

5
Akira Murakami

提供されたデータを使用して、私は異なる結果を得ました:

> packageVersion("tidyr")
[1] ‘0.1’
spread(d, factor2, num)
  factor1 level1 level10 level2
1       A      1       3      2
2       B      4       6      5
3       C      7       9      8
9
KFB