3

我有一个名为 WOE 的函数,它返回一个包含 1 行和 7 列的数据名:

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 或 mapply 与 simple=TRUE)。

于 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 回答