Ошибка при создании функции эластичности для расписания спроса в R

#r #dataframe #for-loop #economics

#r #фрейм данных #для цикла #экономика

Вопрос:

Попытка создать функцию, которая принимает расписание спроса и добавляет столбец в фрейм данных, который имеет эластичность в каждой точке. Если вы запустите мой приведенный ниже код, вы получите фрейм данных с повторяющимися значениями в каждом столбце. Что-то не так с моим циклом for?

 elasticity <- function(df){
  df$PCP <- NULL #percentage change in price 
  df$PCQ <- NULL #percentage change in quantity
  df$elasticity<- NULL #elasticity
  for (i in 1:length(df$Price)){
    df$PCP[i] <- 100*(df$Price[i]-df$Price[i 1])/(0.5*(df$Price[i] df$Price[i 1])) 
  df$PCQ[i] <- 100*(df$Quantity[i 1]-df$Quantity[i])/(0.5*(df$Quantity[i] df$Quantity[i 1]))
  df$elasticity[i] <- df$PCQ[i]/df$PCP[i]
  return(df)
  }
}
df <- data.frame("Price"=c(7:0), "Quantity"=seq(0,14, by=2))
elasticity(df)
 

Ответ №1:

Вам нужно поместить свой оператор return за пределы вашего цикла.

Я думаю, что размещение return внутри вашего цикла означает полный выход из функции, именно поэтому генерируется первый результат. От datamentor.io , «Если это не последний оператор функции, он преждевременно завершит работу функции, возвращая элемент управления в то место, из которого он был вызван».

 sample_function <- function(){
  print("Hi!")
  for(i in seq_along(rep(1,6))){
    return(i)
    print("This is not evaluated")
  }
  print("This is not evaluated either")
}
sample_function()

> sample_function()
[1] "Hi!"
[1] 1
 

Кроме того, поскольку вы делаете i /- i 1 , помните о «по одному».

 elasticity <- function(df){
  df$PCP <- NULL #percentage change in price 
  df$PCQ <- NULL #percentage change in quantity
  df$elasticity<- NULL #elasticity
  for (i in seq_along(df$Price)){
    df$PCP[i] <- 100*(df$Price[i]-df$Price[i 1])/(0.5*(df$Price[i] df$Price[i 1])) 
    df$PCQ[i] <- 100*(df$Quantity[i 1]-df$Quantity[i])/(0.5*(df$Quantity[i] df$Quantity[i 1]))
    df$elasticity[i] <- df$PCQ[i]/df$PCP[i]
    df
  }
  return(df)
}

> elasticity(df)
  Price Quantity       PCP       PCQ  elasticity
1     7        0  15.38462 200.00000 13.00000000
2     6        2  18.18182  66.66667  3.66666667
3     5        4  22.22222  40.00000  1.80000000
4     4        6  28.57143  28.57143  1.00000000
5     3        8  40.00000  22.22222  0.55555556
6     2       10  66.66667  18.18182  0.27272727
7     1       12 200.00000  15.38462  0.07692308
8     0       14        NA        NA          NA