6

列の名前を保持して列を行に変換する方法はありますか?

入力例:

A   B
1   1
2   3
3   4
44  5

出力

 Group Number
  A       1
  A       2
  A       3
  A       44 
  B       1
  B       3
  B       4
  B       5
4

2 に答える 2

10

を使用する必要はありません。base -R の関数をreshape2使用できます。stack

あなたyour.dataの例として:

res <- stack(your.data)
colnames(res) = c("Number", "Group")

あなたにあげる

> res
  Number Group
1      1     A
2      2     A
3      3     A
4     44     A
5      1     B
6      3     B
7      4     B
8      5     B

こちらもご覧ください


meltより大きなデータにreshape2基づくベンチマーク:stack

require(reshape2)
set.seed(45)
DF <- data.frame(matrix(sample(20, 1e6, TRUE), ncol=100))

require(microbenchmark)
microbenchmark(stack(DF), melt(DF), times=100)

Unit: milliseconds
      expr      min       lq   median       uq      max neval
 stack(DF) 157.7084 187.1993 241.8206 251.7132 334.5488   100
  melt(DF) 174.6079 253.1088 261.6234 273.3971 443.9953   100

より速いようstackですが、20ミリ秒の差があります...

于 2013-07-30T13:28:15.413 に答える
9

私は使用しますreshape2

> x <- data.frame(A = 1:5, B = 55:51)
> library(reshape2)
> melt(x)
Using  as id variables
   variable value
1         A     1
2         A     2
3         A     3
4         A     4
5         A     5
6         B    55
7         B    54
8         B    53
9         B    52
10        B    51

ベンチマークを見るのは面白かったです。melt関数を呼び出すときにもっと明示的にすることでオフにできるメッセージをデフォルトで出力します。

> microbenchmark(stack(DF), melt(DF), times=100)
    Unit: milliseconds
          expr      min       lq   median       uq      max neval
     stack(DF) 122.3086 133.8435 139.6990 180.5338 250.9316   100
      melt(DF) 140.0183 198.2025 227.8125 245.3444 367.1552   100

違いは小さいと思いますが、印刷をmeltオフにすると小さくなります。シミュレーションで冗長モードをオフにするという私の予感が役に立ったようです。

> microbenchmark(stack(DF), melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]), times=100)
Unit: milliseconds
                                                      expr      min       lq   median       uq      max neval
                                                 stack(DF) 94.33681 124.9958 132.1747 144.7323 287.7438   100
 melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]) 99.44282 141.0594 150.2625 178.8081 249.0888   100
于 2013-07-30T13:23:39.480 に答える