0

articleID、期間、および需要の列 (articleID および period をキーとして) を含む整然とした形式の data.table を作成したいと思います。要求は、別の data.frame (params) からの入力データを使用したランダム関数の対象となります。これは、実行時にさまざまな数の期間に対して作成されます。

これを「整頓されていない」形式で行うのは簡単です。

#example data
params <- data.frame(shape=runif(10),   rate=runif(10)*2)
rownames(params) <- letters[1:10]
periods <- 10

# create non-tidy data with one column for each period
df <- replicate(nrow(params), 
                   rgamma(periods,shape=params[,"shape"], rate=params[,"rate"]))
rownames(df) <- rownames(params)

この作成を行うための「きちんとした」方法はありますか? rgamma() を複製する必要がありますが、対応する記事のパラメーターを使用する方法がわかりません。data.table からの Cross Join から始めてみました。

dt <- CJ(articleID=rownames(params), per=1:periods, demand=0)

しかし、作成時に rgamma を dt[,demand] に直接かつ正しく渡す方法も、醜い for ループを使用せずに値を変更する方法もわかりません。tidyr パッケージの gather() の使用も検討しましたが、私が見る限り、for ループも使用する必要があります。

現在のユースケースで data.frame と data.table のどちらを使用するかは、私にとってはあまり重要ではありません。いずれか(または両方!)のソリューションをいただければ幸いです。

4

1 に答える 1

1

これでうまくいきます(行名でソートされていると仮定していることに注意してください。paramsそうでない場合は、に変換しdata.tableて2つをマージできます):

CJ(articleID=rownames(params), per=1:periods)[,
  demand := rgamma(.N, shape=params[,"shape"], rate=params[,"rate"]), by = per]
于 2015-03-05T20:16:11.697 に答える