0

我正在 R 中创建一个“成对”数组。给定 vector combo,我找到了 4 个元素的每个排列。因此,一个4 维“成对”数组。我目前的方法是使它成为一个简单的list,使用嵌套sapply函数,如下所示:

fourList <- sapply(X = combo, FUN = function(h) {
    hi <- which(combo == h) #get index of h

    sapply(X = combo[hi:n], FUN = function(i) {
      ii <- which(combo == i) #get index of i

      sapply(X = combo[ii:n], FUN = function(j) {
        ji <- which(combo == j) #get index of j

        sapply(X = combo[ji:n], FUN = function(k) {
          list(c(h,i,j,k))
        })
      })
    })
  })

我想做某种进度指示器,这样我就可以向用户报告已经构建了多少百分比的数组。理想情况下,我只需numberCasesCompleted将其除以totalCases = length(combo)^4得到完成的部分。但是,我似乎无法找出一个算法来接受hijiii,并输出 value numberCasesCompleted。我该如何计算?

在 2D ( xby y) 情况下 (例如: sapply(X, function(x) {sapply(X[xi:n], function(y) {list(c(x,y))}}),这可以通过 计算sum(n - (x-2:x), y-(x-1)),但将其推广到 4 维听起来相当困难。

4

1 回答 1

0

我真笨。只需将第一级的完成比例添加到第二级的完成比例(缩小到第一级的单次迭代),依此类推。

就我而言:completion <- hi/(n+1) + (ii/(n+1))*(1/n) + (ji/n)*(1/n)*(1/n)

n+1分母在那里是因为在hi等于之后实际上还有另一个循环n,因为ii仍然需要完成一整套迭代。否则它将以〜101%结束。但是对于进度的粗略/快速估计,这很好。)

但是,值得注意的是(根据评论中的@Gregor),在 R 中有更好的组合方法,所以我最初的用例可能没有实际意义(只是首先不要使用嵌套sapply)。

于 2018-07-13T23:55:54.710 回答