2017-08-07 15 views
1

私はモデルを作成し、与えられたdata.frame(例えばmtcars)のターゲット変数を予測する関数を作成しようとしています。R言語を使用して関数内で使用する関数引数を抽出するにはどうすればよいですか。

#Function to create a model for predicting a target variable 
myRegModel = function(myFormula,myData){ 
sampleIndex = sample(1:nrow(myData),size= 0.7*nrow(myData), replace=FALSE) 
myTraining = myData[sampleIndex, ] 
myTesting = myData[-sampleIndex, ] 
myDataFit = lm(myFormula, data = myTraining) 
myTesting$predVar <- predict(myDataFit, myTesting) 
myTesting$predErr <- abs(((myTesting$mpg - myTesting$predVar)/ myTesting$mpg)*100) 
print(cor(myTesting$mpg, myTesting$predVar)) 
print(mean(myTesting$predErr)) 
print(summary(myDataFit)) 
} 

myRegModel(mpg ~ ., myMtCars) 

しかし、上記の予測誤差と相関値を見つけた場合、私は目標の妥当性(mpg)をハードコードしています。以来、私は最初の引数として関数内の目標変数を渡している、私は私の目標変数を抽出し、myTesting data.frameに動的に割り当てる方法があります。 (例:myTesting $ target)

+0

を示唆したよう[[を使用し、その後、all.varsを使用して式から直接変数を抽出することができます数式から – akrun

答えて

2

だけ@RuiBarradasアプローチを拡張するために、我々は@RuiBarradasはあなたが興味のある変数を取得するには、 `all.vars`を使用することができます

myRegModel <- function(myFormula,myData){ 
     nm1 <- all.vars(myFormula)[1] 
     sampleIndex <- sample(seq_len(nrow(myData)),size= 0.7*nrow(myData), replace=FALSE) 
     myTraining <- myData[sampleIndex, ] 
     myTesting <- myData[-sampleIndex, ] 
     myDataFit <- lm(myFormula, data = myTraining) 
     myTesting$predVar <- predict(myDataFit, myTesting) 
     myTesting$predErr <- abs(((myTesting[[nm1]] - 
        myTesting$predVar)/ myTesting[[nm1]])*100) 
     myTesting 

    } 

myMtCars <- mtcars 
myRegModel(mpg ~ ., myMtCars) 
#     mpg cyl disp hp drat wt qsec vs am gear carb predVar predErr 
#Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 26.43998 15.964845 
#Hornet 4 Drive  21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 20.84027 2.615556 
#Valiant    18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 20.30464 12.180316 
#Merc 280   19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 18.10403 5.708192 
#Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 11.22245 7.908153 
#Fiat 128   32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 27.88747 13.927557 
#Toyota Corona  21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 25.47992 18.511254 
#Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 16.11037 16.091819 
#Lotus Europa  30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 25.64254 15.649525 
#Maserati Bora  15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 11.47808 23.479490 
+1

ありがとうございました。出来た! :) –

1

はい、あなたがしたいことをする方法があります。 data.frameの列に異なる表記法を使用するだけです。一般に、対話モードではdat$colを使用しても問題ありません。しかし、関数をプログラムするときは、​​を使うほうがはるかに優れています。これらはまったく同じベクトルですが、後者ははるかに柔軟です。

あなたの場合、これはmyTesting[[target]]になります。

+0

ありがとうございました。 :) –

関連する問題