1

stats パッケージの reshape が設計されていることを正確に実行しようとしています。形式の一連の変数を持つ幅広いデータセットがありますvar_name.date。残念ながら、reshape は中規模のデータセットでさえ処理するには不十分なようです。そのため、data.table.melt関数を使用しようとしています。

私の主な問題は、長い形式の変数に基づいて変数を個別の値列にグループ化することです。これは可能ですか、それともそれぞれを個別に実行してから実行する必要がありcbindますか?

ここに私が持っているものがあります:

widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),
                       "B.2012-10"=runif(5),"B.2012-11"=runif(5))


   id  A.2012-10 A.2012-11  B.2012-10 B.2012-11
1:  1 0.82982349 0.2257782 0.46390924 0.4448248
2:  2 0.46136746 0.2184797 0.05640388 0.4772663
3:  3 0.61723234 0.3950625 0.03252784 0.4006974
4:  4 0.19963437 0.7028052 0.06811452 0.3096969
5:  5 0.09575389 0.5510507 0.76059610 0.8630222

そして、これはstatsパッケージがreshape私を嘲笑し、1行の素晴らしさで私が望んでいることを正確に実行しますが、スケーリングはしません。

reshape(widetable, idvar="id", varying=colnames(widetable)[2:5],
        sep=".", direction="long")


    id  time          A          B
 1:  1 2012-10 0.82982349 0.46390924
 2:  2 2012-10 0.46136746 0.05640388
 3:  3 2012-10 0.61723234 0.03252784
 4:  4 2012-10 0.19963437 0.06811452
 5:  5 2012-10 0.09575389 0.76059610
 6:  1 2012-11 0.22577823 0.44482478
 7:  2 2012-11 0.21847969 0.47726629
 8:  3 2012-11 0.39506249 0.40069737
 9:  4 2012-11 0.70280519 0.30969695
10:  5 2012-11 0.55105075 0.86302220
4

1 に答える 1

1

reshape()これは、をより簡単に使用できる場合の 1 つにすぎません。

melt私が考えることができるandの組み合わせを使用した最も直接的なアプローチdcast.data.tableは次のとおりです。

library(data.table)
library(reshape2)

longtable <- melt(widetable, id.vars = "id")
vars <- do.call(rbind, strsplit(as.character(longtable$variable), ".", TRUE))
dcast.data.table(longtable[, c("V1", "V2") := lapply(1:2, function(x) vars[, x])],
                 id + V2 ~ V1, value.var = "value")

別の方法は、私の「splitstackshape」パッケージ、特に開発バージョンmerged.stackから使用することです。

# library(devtools)
# install_github("splitstackshape", "mrdwab", ref = "devel")
library(splitstackshape)

merged.stack(widetable, id.vars = "id", var.stubs = c("A", "B"), sep = "\\.")
#     id .time_1          A         B
#  1:  1 2012-10 0.26550866 0.2059746
#  2:  1 2012-11 0.89838968 0.4976992
#  3:  2 2012-10 0.37212390 0.1765568
#  4:  2 2012-11 0.94467527 0.7176185
#  5:  3 2012-10 0.57285336 0.6870228
#  6:  3 2012-11 0.66079779 0.9919061
#  7:  4 2012-10 0.90820779 0.3841037
#  8:  4 2012-11 0.62911404 0.3800352
#  9:  5 2012-10 0.20168193 0.7698414
# 10:  5 2012-11 0.06178627 0.7774452

この関数は、異なる列のグループを a に「積み重ね」、次にそれらをマージすることから始まるためmerged.stack、単純な関数とは異なる動作をします。これにより、関数は次のことが可能になります。meltlist

  1. 各列グループが異なるタイプ (文字、数値など) である可能性がある列グループを操作します。
  2. "不均衡な" 列グループを操作します (1 つのグループには 2 つのメジャー列があり、別のグループには 3 つのメジャー列がある場合があります)。

この回答は、次のサンプル データに基づいています。

set.seed(1) # Please use `set.seed()` when sharing an example with random numbers
widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),
                       "B.2012-10"=runif(5),"B.2012-11"=runif(5))

参照:単一のステップで解決できない溶融/キャスト可能な再形成の問題は何ですか?

于 2014-07-12T06:47:27.553 に答える