如何多次重复代码并将每次迭代的输出存储在同一个数据框中?

How to repeat a code for multiple times and store the output of each iteration in the same dataframe?

我问两个问题:

  1. 如何运行一个代码多次?
  2. 如何将每次迭代的输出存储在同一个数据帧中?

我的代码中有 3 个输出:maermseper_metrics。我只想 per_metrics 作为我每次迭代的最终输出,并存储每个 per_metics 的结果作为我所有迭代的整体输出。

    getValue <- function() {
    mae <- mae(dp$true_norm, dp$dp_threshold_norm)
    rmse <- rmse(dp$true_norm, dp$dp_threshold_norm)
    per_metrics <- c(mae,rmse)
return(i)
    }
result <- replicate(10, getValue())

N.B。迭代次数 = 10

这只是我的代码的一部分,我对所有迭代都有相同的输入,但在输入和输出之间有一个噪声添加机制 rlaplace()。所以每次迭代我都会得到不同的结果。

在没有可重现示例的情况下,以下使用 {Metrics} 包文档中的示例来构建您的数据框 dp。酌情增加。

此外,您还需要为函数提供参数。在这种情况下,我们提供数据框 dp(您在函数中调用)。

最后,replicate() returns 一个 array/matrix。我们将其重新格式化为“长”格式,然后将其强制转换为数据框。

library(Metrics)

# simulate the data -----------------------------------------
actual <- c(1.1, 1.9, 3.0, 4.4, 5.0, 5.6)
predicted <- c(0.9, 1.8, 2.5, 4.5, 5.0, 6.2)

dp <- data.frame(
    true_norm         = actual
  , dp_threshold_norm = predicted
)

# make function work -----------------------------------------
getValue <- function(dp) {          # we define a parameter dp for the function
     mae <- mae(dp$true_norm, dp$dp_threshold_norm)
     rmse <- rmse(dp$true_norm, dp$dp_threshold_norm)
     per_metrics <- c(mae,rmse)
     return(per_metrics)            # return value 
}

# apply function multiple times with replicate()
# check this to understand the returned data format
replicate(n = 10, expr = getValue(dp))

# result ---------------------------------------------
## store in variable
result <- replicate(n = 10, expr = getValue(dp))

## coerce to "long data frame"  - here we set ncol 2 for 2 variables
result <- matrix(result, ncol = 2)

## coerce to data frame
result <- as.data.frame.array(result)

这产生:

result

          V1        V2
1  0.2500000 0.2500000
2  0.3341656 0.3341656
3  0.2500000 0.2500000
4  0.3341656 0.3341656
5  0.2500000 0.2500000
6  0.3341656 0.3341656
7  0.2500000 0.2500000
8  0.3341656 0.3341656
9  0.2500000 0.2500000
10 0.3341656 0.3341656

您现在可以根据需要重命名列。