2017-09-19 8 views
2

これはRの初心者です。基本的には、1つのデータフレームからデータを取り出し、その出力を新しいデータフレームを作成するだけでなく、自動的に "次の入力を受け取る"ループを作成し、重複をスキップします。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

答えて

0

私は上記の答えにはコメントできない申し訳ありませんが(私の答えは、コメントのより属するが、私は本当にまだそのための権限がありません)。

実行されたループのバリエーションを使用できますが、iに数値を使用する代わりに、ループコードを空港コードで繰り返し実行します。その厄介なコードが、私の脳の働き方

最初に、新しい結果ソリューションを保存する空のdata.frameを作成します。 次に、すべての空港コードを含むベクトルを作成します。 あなたが提供する空港コードのベクトルをループするように設定します。

ループ内で最初に行うのは、その最初の空港コードに基づいてデータをサブセット化することです。あなたのリストでは、Airport_Code == item#1を持つ空港だけをあなたのコードベクトルに乗ります。それからあなたの回帰が実行され、サマリーなどからどの値を取るかを教えてくれます。あなたが望む値があれば、それをベクトル解new_dataに格納し、それを空のdata.frameにrbind-edします私たちはソリューションのために作成しました。最後の行は、結果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) 
} 

あなたは結果枠内の各エントリは、回帰の個々の空港コードの結果であるように、すでに空港コードによってデータをサブセット化しているので、あなたは、任意の重複を排除する必要はありません。

0

大きなデータフレームをすべて空港コードでスライスし、サブセット化されたデータフレームオブジェクトとしてそれぞれを回帰処理のような呼び出された関数に渡すことを検討してください。

最終出力は、空港コードと対応する空港コードで指定されたリストの各項目と等しい長さのデータフレームのリストになります。

割り当て機能

# 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 
... 
関連する問題