如何多次重复代码并将每次迭代的输出存储在同一个数据框中?
How to repeat a code for multiple times and store the output of each iteration in the same dataframe?
我问两个问题:
- 如何运行一个代码多次?
- 如何将每次迭代的输出存储在同一个数据帧中?
我的代码中有 3 个输出:mae
、rmse
和 per_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
您现在可以根据需要重命名列。
我问两个问题:
- 如何运行一个代码多次?
- 如何将每次迭代的输出存储在同一个数据帧中?
我的代码中有 3 个输出:mae
、rmse
和 per_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
您现在可以根据需要重命名列。