对于R中函数内的嵌套变量的循环

时间:2018-09-11 10:41:11

标签: r function for-loop montecarlo

我想遍历值的向量并在R中的函数环境中为每个值计算一些东西。例如:

# I have costs for 3 companies
c <- c(10, 20, 30)
# I have the same revenue across all 3 
r <- 100
#  I want to obtain the profits for all 3 within one variable
result <- list()

# I could do this in a for loop
for(i in 1:3){
    result[i] <- r - c[i]
}

现在假设我有一个非常长的模型,并且我将所有内容都定义为一个函数,可以通过各种随机抽取来解决成本。

# Random draws
n  <- 1000
r  <- rnorm(n, mean = 100,  sd = 10)
c1 <- rnorm(n, mean = 10,  sd = 1)
c2 <- rnorm(n, mean = 20,  sd = 2)
c3 <- rnorm(n, mean = 30,  sd = 3)
X  <- data.frame(r, c1, c2, c3)

fun <- function(x){
       r  <- x[1]
       c  <- c(x[2], x[3], x[4])

       for(i in 1:3){
           result[i] <- r - c[i]
       }
  return(result)
}

然后我可以通过遍历随机抽样的输入数据的行来评估所有平局的结果。

for(j in 1:n){
  x <- X[j,]
  y <- fun(x)
}

在此示例中,输出变量y将包含嵌套的结果变量,该结果变量包含所有3家公司的结果。但是,我的思路导致错误,我认为这与我尝试返回嵌套变量有关?因此,我的问题是你们将如何处理这种事情。

2 个答案:

答案 0 :(得分:2)

我建议您重新考虑您的编码方法。这是一种非常像R的方式。

例如,第一个for循环可以更简洁地编写为

x <- c(10, 20, 30)
r <- 100
result <- lapply(-x, `+`, r)

然后fun变成类似

fun <- function(x) lapply(-x[-1], `+`, x[1])

然后要对data.frame的行进行操作(这似乎是您在最后一步中所做的事情),可以使用类似

的方法
apply(X, 1, fun)

其中MARGIN = 1中的apply参数可确保您在每行(而不是每列)上应用函数。

答案 1 :(得分:0)

以下是使用函数和for循环的一种方法:

# Random draws
n  <- 1000
r  <- rnorm(n, mean = 100,  sd = 10)
c1 <- rnorm(n, mean = 10,  sd = 1)
c2 <- rnorm(n, mean = 20,  sd = 2)
c3 <- rnorm(n, mean = 30,  sd = 3)
X  <- data.frame(r, c1, c2, c3)

result <- list()

fun <- function(x){
  r  <- x[[1]]
  c  <- c(x[[2]], x[[3]], x[[4]])

  for(i in 1:3){
    result[i] <- r - c[i]
  }
  return(result)
}

# Create a list to store results 
profits <- rep(rep(list(1:3)),nrow(X))

# Loop throuhg each row of dataframe and store in profits.
for(i in 1:nrow(X)){

  profits_temp <- 
    fun(list(X[i,"r"],X[i,"c1"],X[i,"c2"],X[i,"c3"]))

  for(j in 1:3)
    profits[[i]][[j]] <- profits_temp[[j]]

  }

# Eye results
profits[[1]]
#> [1] 93.23594 81.25731 70.27699

profits[[2]]
#> [1] 80.50516 69.27517 63.36439