如何处理R中复制的结果?

时间:2016-07-20 07:02:18

标签: r

假设我有以下代码,它基本上为我提供了12个月的收入和成本的随机模拟

simulate.revenue<-function() {
  return(sapply(rnorm(12,100000,30000),function(x) max(0,x)))
}
simulate.cost<-function() {
  return(sapply(rnorm(12,50000,20000),function(x) max(0,x)))
}

sim.run<-function() {
  revenue<-simulate.revenue()
  cost<-simulate.cost()
  profit<-revenue-cost
  year.simulation<-data.frame(revenue,cost,profit)
  return(year.simulation)
}

现在运行上面的模拟功能10次,我知道我应该:

sim.results<-replicate(10,sim.run())

所以问题是如何进一步处理sim.results说:

  1. 查找每次运行的年度总利润的平均值
  2. 在每次运行中找到按月计算的利润均值(平均值(利润[1],平均值(利润[2]),...)

1 个答案:

答案 0 :(得分:1)

复制结果的结构:

replicate(1, sim.run())可以轻松地为您提供返回内容的结构:data.frame的每一列的列表项(此处为3个列表项)。运行两个模拟会添加另外3个列表项。

将其转换为正确格式:

要将list转换为data.frame使用:

result <- data.frame(matrix(unlist(sim.results), nrow = 12, byrow = FALSE))

在您的情况下,结果data.frame的每3列对应一个模拟。将模拟再次分成列表:

result_list <- list()
m <- 1
n_simulations <- 10
n_columnsPerSimulation <- 3
for (i in seq(1, n_simulations * n_columnsPerSimulation, n_columnsPerSimulation)){
    result_list[[m]] <- result[,seq(i, i+n_columnsPerSimulation-1)]
    m <- m + 1
}

这非常难看,但似乎有效。

分析结果:

现在您可以分析每个模拟,例如与sapply / lapply一样,如下例所示:

sapply(result_list, function(x) mean(x[,1]))