2016-09-13 1 views
-2

インデックスやラベルをmap * type関数に渡したい場合があります。とりわけ、すべての可能な組み合わせを列挙するのが最も簡単な解決策であるという問題があります。だから、私は今、私はエレガントな行列の行を表示するには?

data.frame(t(x))

のような醜いハックをリストに各行を変換するなど何かをしたい、今すぐこの

x = expand.grid(paste0("A", 1:10), paste0("B", 1:10))

Var1 Var2 
1 A1 B1 
2 A2 B1 
3 A3 B1 
4 A4 B1 
5 A5 B1 
6 A6 B1 

のような式を書きますこれは出力がネストされたリストであるため煩わしく、別のlapplyを修正する必要があります。

apply(x, 1, list)その後、lapply(.Last.value, unlist)

はこの権利を行うための、よりエレガントな方法がなければなりませんか?

+0

は、あなたが望むものに ''近いスプリット(X、行(X))ですか? – aichao

答えて

1

xが質問のタイトルと同じ行列の場合、私はdata.frame(t(x))を実行することは悪い考えではないと思います。一方、によって生成されたデータフレームであれば、がデータフレームを基にしてデータと変更の記憶モードを変更するため、t(x)よりも優れているので、data.tableパッケージのtranspose関数を使用できます。バックtranspose?transposeからように転置リスト、データフレームまたはデータテーブルのために設計されている間、非常に非効率的であり得るデータのフレームにそれ:

転置リスト、データフレームまたはデータ・テーブルを転置するための効率的な方法です。ここで

データフレームを転置に関するいくつかのベンチマークです:

microbenchmark::microbenchmark(data.frame(t(x)), data.table::transpose(x), split(x, 1:nrow(x)), lapply(apply(x, 1, list), unlist), times = 10) 

# Unit: milliseconds 
#        expr  min   lq  mean  median   uq  max neval 
#     data.frame(t(x)) 114.061549 117.662053 121.628102 120.812289 125.132211 135.421358 10 
#   data.table::transpose(x) 1.146525 1.400207 1.469908 1.467571 1.623157 1.736432 10 
#    split(x, 1:nrow(x)) 160.550576 161.626339 187.385706 167.800102 179.647717 355.913319 10 
# lapply(apply(x, 1, list), unlist) 8.183313 8.379791 9.317694 8.783287 9.883049 12.345740 10 
関連する問題