#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