如何多次重复代码并将每次迭代的输出存储在同一个数据帧中?
Posted
技术标签:
【中文标题】如何多次重复代码并将每次迭代的输出存储在同一个数据帧中?【英文标题】:How to repeat a code for multiple times and store the output of each iteration in the same dataframe? 【发布时间】:2021-10-23 05:48:26 【问题描述】:我要问两个问题:
-
如何多次运行一个代码?
如何将每次迭代的输出存储在同一个数据帧中?
我的代码中有 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())
注意迭代次数 = 10
这只是我的代码的一部分,我对所有迭代都有相同的输入,但在输入和输出之间有一个噪声添加机制rlaplace()
。所以每次迭代都会得到不同的结果。
【问题讨论】:
查看replicate
、sapply
和lapply
的文档。
要补充 Roman,请检查您的功能和使用 modelr
。 mae()
和rmse()
期待模型和数据。该文档显示了一个示例。如果您想使用相同的输入运行 getValue()
函数,您将生成相同的结果。 per_metrics
(返回)变量当前是一个向量,即用 c() 构造。因此,考虑将其编码为数据框。由于 R 内存管理有点不礼貌,因此“增长”数据帧不是最佳实践。但是对于 10 次迭代,它将起作用。请注意,这样循环,result[i,]
@Ray,可能 OP 正在使用 Metrics 包
在另一种情况下,您的函数将在任何情况下返回相同的结果,除非输入被更改。
我每次迭代都有相同的输入,但我每次都添加随机噪声,所以我得到不同的结果,因此 MAE 和 RMSE 不同。
【参考方案1】:
在没有可重现示例的情况下,以下使用来自 Metrics
包文档的示例来构建您的数据框 dp
。酌情增加。
您还需要为函数提供参数。在这种情况下,我们提供数据框 dp
(您在函数中调用)。
最后,replicate()
返回一个数组/矩阵。我们将其重新格式化为“长”格式,然后将其强制转换为数据框。
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
您现在可以根据需要重命名列。
【讨论】:
如果我的输入在每次迭代中都发生了变化,这是否意味着我应该在function(dp)
中包含 dp
以及参数,并且对于您建议的其余代码保持不变?
抱歉,过了一段时间才回来。函数的思想是执行操作。因此,一般input --> function --> output
。很难从您的示例中判断每次迭代如何/发生了什么变化。但从概念上讲,我会说是的。您当然可以只提供改变/相关的参数(对象,例如向量、值)。祝你好运!以上是关于如何多次重复代码并将每次迭代的输出存储在同一个数据帧中?的主要内容,如果未能解决你的问题,请参考以下文章