R loop - 选取下一个输入并将输出存储到数据框

时间:2017-09-19 14:42:52

标签: r loops dataframe

所以我是R的新手,基本上我希望通过从一个数据框中获取数据并将输出存储到新数据框中来获得大量回归,但也要创建一个自动循环"拿起下一个输入"并跳过重复项。

我附上了我的数据的照片。

这是我运行回归的代码

#inputs
Airport = "ABZ"


#choose target airport & nation GDP
df <- subset(Elasticities_Study, Airport_Code==Airport)

#log-log
df <- data.frame(df$Year, df$Region, 
             df$Airport_Code, log(df$Passengers, 10), log(df$GDP, 10))
colnames(df) <- c("Year", "Region", 
                         "Airport", "Passengers", "GDP")

#regression
fit <- lm(df$Passengers ~ df$GDP)

#store the coefficient
coefficient <-coefficients(fit)
elasticity <- coefficient["df$GDP"]

#store the p_value
p <- function (fit) {
  if (class(fit) != "lm") stop("Not an object of class 'lm' ")
  f <- summary(fit)$fstatistic
  p <- pf(f[1],f[2],f[3],lower.tail=F)
  attributes(p) <- NULL
  return(p)
}

p_value <- p(fit)

#store the r_squared
r_squared <- summary(fit)$r.squared

#save regression output into data frame
Regression_Output <- data.frame(df[1,2], df[1,3], 
                            elasticity, p_value, r_squared)
colnames(Regression_Output) <- c("Region", "Airport", "Elasticity", "P-
Value", "R_Squared")

请有人帮忙!谢谢!

rawdata

2 个答案:

答案 0 :(得分:0)

抱歉,我无法对上述答案发表评论(我的答案更多的是评论,但我还没有真正的权限)。

您可以使用已执行的循环Ben_its的变体,但不是使用i的数值,而是按机场代码循环迭代。它凌乱的代码,但它的大脑是如何工作的

首先创建一个空白的data.frame来存储新的结果解决方案。 然后创建一个包含所有机场代码的向量。 设置循环以循环通过您提供的机场代码向量。

在循环中,它首先要做的是根据第一个机场代码对数据进行子集化。因此,在您的列表中,只需要在您的代码矢量上使用Airport_Code == item#1的机场。然后它将运行你的回归,你将告诉它从摘要中获取哪些值等。一旦它具有你想要的值,它就将它存储到矢量解决方案new_data中,然后rbind-ed到空白data.frame我们为解决方案创建。最后一行是通过获取结果data.frame的先前对象并根据机场代码基于子集化数据添加刚刚获得的解决方案的新行来创建新结果data.frame的地方。然后,它会遍历代码向量中的下一个机场代码。

your_data = data.frame(source data)
## Create empty data.frame to store solutions. We will use the loop and rbind to constantly add a row of solutions with each iteration of the loop
results = data.frame()
codes = c(all of your airport codes)
for (i in codes){
    ## here you use the variable of the loop to subset your whole dataset based on that airport code
    byairportcode = subset(your_data,your_data$Airport_Code == i)
    ## All operations listed in your post, creating a vector of your desired information/solutions for each line
    new_data = something(parameters)
    ###combine this new data with your list of solutions by airport code 
    results = rbind(results,new_data)
} 

您不需要消除任何重复项,因为您已经按机场代码对数据进行了子集化,因此结果框中的每个条目都是每个机场代码的回归结果。

答案 1 :(得分:0)

考虑使用by按每个机场代码对大型数据帧进行切片,并将每个作为子集化的数据框对象传递给调用函数,如回归处理。

最终输出将是一个数据帧列表,其长度与不同的机场代码相等,并且每个列表项都由相应的机场代码命名。

分配功能

# store the p_value
p <- function (fit) {
   if (class(fit) != "lm") stop("Not an object of class 'lm' ")
   f <- summary(fit)$fstatistic
   p <- pf(f[1],f[2],f[3],lower.tail=F)
   attributes(p) <- NULL

   return(p)
}

# run regressions
regression_process <- function(df) {

   #log-log
   df <- data.frame(Year=df$Year, Region=df$Region, Airport=df$Airport_Code,
                    Passengers=log(df$Passengers, 10), GDP=log(df$GDP, 10))
   #regression
   fit <- lm(df$Passengers ~ df$GDP)

   #store the coefficient
   coefficient <-coefficients(fit)
   elasticity <- coefficient["df$GDP"]

   p_value <- p(fit)

   #store the r_squared
   r_squared <- summary(fit)$r.squared

   #save regression output into data frame
   data.frame(Region=df[1,2], Airport=df[1,3], Elasticity=elasticity, 
              P_Value=p_value, R_Squared=r_squared)
}

按() 运行(为每个机场代码创建一个指定数据框列表)

regression_list <- by(Elasticities_Study, Elasticities_Study$Airport_Code, 
                      FUN=regression_process)

regression_list$ABE   # FIRST REGRESSION DATAFRAME ELEMENT
regression_list$ABI   # SECOND REGRESSION DATAFRAME ELEMENT
regression_list$ABJ   # THIRD REGRESSION DATAFRAME ELEMENT
...