2017-06-27 4 views
1

Ich möchte eine Funktion, bei der die Argumente einen Variablennamen annehmen können (der Teil eines Datasets ist, aber nicht als Objekt in der Umgebung gespeichert wird)) und fügt diesen Variablennamen in eine Modellformel ein.R - wie man Spaltennamen als Argumente in einer Funktion verwendet und in eine Modellformel einfügt

Zum Beispiel:

# Some data with a couple of variables 
my_df <- data.frame(y = rbinom(10, 1,0.5), var1 = runif(10), var2 = runif(10)) 

# A function that fits a model using predictor specified in the arguments 
my_fun <- function(var_name, df){ 
    glm(y ~ var_name, data = df, family = "binomial") 
} 

Wenn ich versuche, die Funktion, die ich die folgenden Fehlermeldung

my_fun(var1, my_df) 
Error in eval(expr, envir, enclos) : object 'var1' not found 

# What I want the function to do 
glm(y ~ var1, data = my_df, family = "binomial") 

Gibt es eine Möglichkeit, diese Art von Funktion zu erhalten bekommen zu verwenden, zu arbeiten?

+0

Innen my_fun, können Sie 'glm verwenden (umformulieren (var_name, "y"), df data =, family = "binomial") '' und dann 'my_fun (" var1 ", df)', um die Regression auszuführen. – lmo

Antwort

4

können Sie unquoted analysieren var_name mit substitute:

my_fun <- function(var_name, df){ 
    glm.formula <- substitute(y ~ x, list(x = substitute(var_name))) 
    glm(glm.formula, data = df, family = "binomial") 
} 

Ein Beispiel:

my_fun(var1, my_df) 

# Call: glm(formula = glm.formula, family = "binomial", data = df) 
# 
# Coefficients: 
# (Intercept)   var1 
#  -1.226  3.108 
# 
# Degrees of Freedom: 9 Total (i.e. Null); 8 Residual 
# Null Deviance:  13.46 
# Residual Deviance: 11.35 AIC: 15.35 

glm(y ~ var1, data = my_df, family = "binomial") 

# Call: glm(formula = y ~ var1, family = "binomial", data = my_df) 
# 
# Coefficients: 
# (Intercept)   var1 
#  -1.226  3.108 
# 
# Degrees of Freedom: 9 Total (i.e. Null); 8 Residual 
# Null Deviance:  13.46 
# Residual Deviance: 11.35 AIC: 15.35 
Verwandte Themen