2017-08-07 256 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) 

然而,我已經硬編碼我的目標varaible(MPG)中找到上述預測誤差和相關值的情況下。因爲,我將我的目標變量作爲第一個參數傳遞給函數,是否有一種方法可以提取我的目標變量並動態分配給myTesting data.frame。 (例如myTesting $ target)

+0

你可以用'all.vars'獲得感興趣的變量從公式 – akrun

回答

2

只是延長@RuiBarradas方法,我們可以使用all.vars則公式直接提取變量,使用[[作爲@RuiBarradas建議

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

非常感謝您的建議。 :) –