【问题标题】:How to create a function in R so that the name of the arguments become objects within my function?如何在 R 中创建一个函数,以便参数的名称成为我函数中的对象?
【发布时间】:2021-11-22 08:27:16
【问题描述】:

我对 R 比较陌生。我想创建一个函数,其中参数将是我的函数中调用的函数 glm 中的变量(对象)。

我有一个包含多个变量(列)的数据框。我希望使用 glm() 运行多个逻辑回归,使用相同的预测变量(术语),只有一个变化,因此需要该函数。我希望能够指定此预测器的名称以及glm() 创建的对象的名称。

例如:

myfunc <-function (myvar, mymodel) {
    mymodel <- glm (var1 ~ var2 + var3 + var4 + myvar, data = myframe, family = "binomial")
}

我希望我的函数的参数允许我通过替换一个变量来多次运行相同的分析并获得不同对象的结果。例如,

myfunc(var_A, model_A)

应该等价于

model_A<- glm (var1 ~ var2 + var3 + var4 + var_A, data = myframe, family = "binomial")

myfunc(var_B, model_B)

应该等价于

model_B<- glm (var1 ~ var2 + var3 + var4 + var_B, data = myframe, family = "binomial")

等等。

我找不到如何编写函数以使参数的名称成为函数中的对象。

【问题讨论】:

    标签: r function


    【解决方案1】:

    您可以尝试使用 lapply 功能 例如,看下面的代码

    
    > head(iris)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa
    

    我将尝试生成线性模型列表,其中 Sepal.Length 作为自变量,Sepal.Width 作为模型之间的公共因变量,并且每次从集合中再增加一个变量(“Petal.Length”,“Petal.Length”。宽度”,“物种”)

    changing.variables <- c("Petal.Length", "Petal.Width", "Species")
    df <- iris[changing.variables]
    
    list.lm <- lapply(df, FUN = function(x) lm(Sepal.Length~Sepal.Width+x, data = iris))
    list.lm
    

    输出

    > list.lm
    $Petal.Length
    
    Call:
    lm(formula = Sepal.Length ~ Sepal.Width + x, data = iris)
    
    Coefficients:
    (Intercept)  Sepal.Width            x  
         2.2491       0.5955       0.4719  
    
    
    $Petal.Width
    
    Call:
    lm(formula = Sepal.Length ~ Sepal.Width + x, data = iris)
    
    Coefficients:
    (Intercept)  Sepal.Width            x  
         3.4573       0.3991       0.9721  
    
    
    $Species
    
    Call:
    lm(formula = Sepal.Length ~ Sepal.Width + x, data = iris)
    
    Coefficients:
    (Intercept)  Sepal.Width  xversicolor   xvirginica  
         2.2514       0.8036       1.4587       1.9468  
    

    【讨论】:

      【解决方案2】:

      另一种可能的解决方案是:

      data(iris)
      iris <- iris[1:100,]
      
      myfunc <-function (myvar, mymodel) {
        formula <- reformulate(termlabels = c('Sepal.Length',myvar), response = 'Species')
        model <- glm (formula, data = iris, family = "binomial")
        assign(mymodel,model,pos = globalenv())
      }
      
      myfunc("Sepal.Width","model_a")
      

      这里函数的输入必须是字符。在您的示例中,函数应如下所示:

      myfunc <-function (myvar, mymodel) {
        
        formula <- reformulate(termlabels = c("var2" , "var3" , "var4" , myvar), response = 'var1')
        model <- glm (formula, data = myframe, family = "binomial")
        assign(mymodel,model,pos = globalenv())
        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 2018-05-29
        相关资源
        最近更新 更多