Для циклов для вложенных переменных внутри функции в R - PullRequest
0 голосов
/ 11 сентября 2018

Я хотел бы пройтись по векторам значений и вычислить что-то для каждого значения, находясь в функциональной среде в 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 голосов
/ 11 сентября 2018

Вот подход, использующий вашу функцию и цикл 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
0 голосов
/ 11 сентября 2018

Я бы предложил переосмыслить ваш подход к кодированию.Это очень не-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 гарантирует, что вы применяете функцию для каждой строки (в отличие от столбца).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...