3

1行7列のデータ名声を返す関数呼び出しWOEがあります。

WOE(inData, splitCol, range, tgtCol, adjfac)

inDataがデータフレームであり、splitCol、tgtCol、およびadjfacが数値である場合、範囲は単一の数値または2x1行列にすることができます(例:range=10またはrange=c(10、20))。

ここで、範囲がn行の行列の場合、関数が行ごとにWOEを実行し、n行7列のデータフレームを返す関数を作成します。今のところ、cbindでforループを使用しています。

df <- rbind(df, WOE(inData, splitCol, range[i,], tgtCol, adjfac))
for (i in 2:nrow(range)) {
  df <- rbind(df, WOE(inData, splitCol, range[i,], tgtCol, adjfac))
}

しかし、私はforループが好きではありません...私はそれをもっと単純にしたいのです。だから私もこのようにmapplyを使おうとしました:

 mapply(t(WOR, list(inData), list(splitCol), split(range, nrow(range)), list(tgtCol), list(adjfac))

しかし、上記の行は私が望むようにデータフレームを返しません。それは多くのリストのデータフレームを返します。これは私がさらに計算するのが非常に難しいです。

forループをより少ない行に集約するための提案はありますか?ありがとう!

4

2 に答える 2

5
do.call(rbind, lapply(1:nrow(range), function(i) WOE(inData, splitCol, range[i,], tgtCol, adjfac)))

「適用」操作の結果をどのように組み合わせるかを正確に制御したい場合に、このイディオムをよく使用します。このようにして、自動単純化のルールが何であるかを覚えておく必要はありません (つまり、sapply や、simplify=TRUE を指定した mapply)。

于 2012-11-22T03:40:44.927 に答える
0

まず、次のように仮定します。

WOE = function(i) data.frame(matrix(runif(7),nrow=1))
WOE(1)
#       X1     X2     X3     X4     X5      X6     X7
# 1 0.7973 0.5489 0.8095 0.6375 0.7322 0.03601 0.3647

sapply(seq(5), function(x) WOE(x))
#    [,1]   [,2]    [,3]     [,4]    [,5]   
# X1 0.6664 0.02439 0.8753   0.0384  0.5619 
# X2 0.7818 0.1433  0.005552 0.5223  0.3665 
# X3 0.6308 0.551   0.7413   0.6464  0.3405 
# X4 0.4988 0.04422 0.8696   0.9513  0.01265
# X5 0.92   0.9563  0.4194   0.03145 0.05684
# X6 0.4526 0.07379 0.246    0.6304  0.3623 
# X7 0.6959 0.087   0.99     0.8185  0.2488 

単純?したがって、以下の @mnel のコメントによると、マトリックスも適している場合は、次のように振る舞うことができます。

sapply(seq(2,nrow(range)), function(i) WOE(inData, splitCol, range[i,], tgtCol, adjfac))

ただし、厳密に必要な場合data.frame(すべてのセルが同じタイプではない場合)、これを使用できます。

do.call(rbind, lapply(seq(2,nrow(range)), 
        function(i) WOE(inData, splitCol, range[i,], tgtCol, adjfac)))
于 2012-11-22T03:32:39.153 に答える