【问题标题】:How can I extract a function argument to use inside the function using R language ?!如何使用 R 语言提取函数参数以在函数内部使用?!
【发布时间】:2017-08-07 10:27:29
【问题描述】:

我正在尝试创建一个函数,该函数可以创建模型并可以预测任何给定 data.frame(例如 mtcars)的目标变量。

#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)

【问题讨论】:

  • 您可以使用all.vars从公式中获取感兴趣的变量

标签: r function statistics linear-regression


【解决方案1】:

只是为了扩展@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

【讨论】:

    【解决方案2】:

    是的,有一种方法可以做你想做的事。您只需对data.frame 的列使用不同的表示法。一般来说,在交互模式下使用dat$col 是可以的。但是当你编写一个函数时,最好使用dat[[col]]。它们是完全相同的向量,但后者更灵活。

    因此,在您的情况下,这将变为 myTesting[[target]]

    【讨论】:

    • 非常感谢您的建议。 :)
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2017-11-21
    • 2020-07-21
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多