R while循环与矢量条件

时间:2015-02-20 12:52:48

标签: r function while-loop dataframe vectorization

我想对使用while循环的函数进行矢量化。

原始功能是

getParamsLeadtime <- function(leadtimeMean, in_tolerance, tolerance){
  searchShape=0
  quantil=0

  # iterates the parameters until the percentage of values is within the interval of tolerance
  while (quantil < in_tolerance){
    searchShape = searchShape+1
    quantil <- pgamma(leadtimeMean+tolerance,shape=searchShape,rate=searchShape/leadtimeMean) -
                  pgamma(leadtimeMean-tolerance,shape=searchShape,rate=searchShape/leadtimeMean) 
  }

  leadtimeShape <- searchShape
  leadtimeRate <- searchShape/leadtimeMean 

  return(c(leadtimeShape, leadtimeRate))
}

我希望对此函数进行矢量化调用,以将其应用于数据框。目前我正在循环使用它:

leadtimes <- data.frame()

for (a in seq(92:103)) {
  leadtimes <- rbind(leadtimes, getParamsLeadtime(a, .85,2))
}

当我试图对该函数进行矢量化时,while似乎并不接受向量作为条件。发生以下警告:

Warning message:
In while (input["U"] < rep(tolerance, dim(input)[1])) { :
  the condition has length > 1 and only the first element will be used

这让我想到虽然不喜欢矢量。你能告诉我如何对这个函数进行矢量化吗?

在旁注中,我想知道为什么生成的leadtimes-data.frame的列名显示为值:

> leadtimes
   X1     X1.1
1   1 1.000000
2   1 0.500000
3   4 1.333333
4   8 2.000000
5  13 2.600000
6  19 3.166667
7  25 3.571429
8  33 4.125000
9  42 4.666667
10 52 5.200000
11 63 5.727273
12 74 6.166667

1 个答案:

答案 0 :(得分:0)

这是一个非常高效的选项。

我们通过足够大的pgamma序列,针对+tol-tol案例,针对给定的平均提前期,shp计算in_tol。我们计算(矢量化)差异,并与in_tol进行比较。向量的第一个元素(大于shp)的索引(减1,因为我们开始我们的序列为0)是导致pgamma大于{{in_tol的最低值f <- function(lead, in_tol, tol) { shp <- which(!(pgamma(lead + tol, 0:10000, (0:10000)/lead) - pgamma(lead - tol, 0:10000, (0:10000)/lead)) < in_tol)[1] - 1 rate <- shp/lead c(shp, rate) } 。 1}}。

sapply

然后我们可以在一系列平均交付周期内t(sapply(1:12, f, 0.85, 2)) ## [,1] [,2] ## [1,] 1 1.000000 ## [2,] 1 0.500000 ## [3,] 4 1.333333 ## [4,] 8 2.000000 ## [5,] 13 2.600000 ## [6,] 19 3.166667 ## [7,] 25 3.571429 ## [8,] 33 4.125000 ## [9,] 42 4.666667 ## [10,] 52 5.200000 ## [11,] 63 5.727273 ## [12,] 74 6.166667 system.time(leadtimes <- sapply(1:103, f, 0.85, 2)) ## user system elapsed ## 1.28 0.00 1.30

NA

你只需要确保为形状参数选择合理的上限(这里我选择了10000,这比慷慨更多)。请注意,如果您选择足够高的上限,则某些返回值将为{{1}}。