2012-08-16 26 views
11

Tengo un marco de datos con digamos N + 2 columnas. La primera son solo fechas (usadas principalmente para trazar más adelante), la segunda es una variable cuya respuesta a las N columnas restantes me gustaría calcular. Estoy pensando que debe haber algo comoUso de lm de R en un marco de datos con una lista de predictores

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10)) 
fit = lm(y~df[,2:3],data=df) 

Esto no funciona. También he intentado y no con

fit = lm(y~sapply(colnames(df)[2:3],as.name),data=df)

¿Alguna idea?

Respuesta

26

El uso de la notación de fórmula y ~ . especifica que desea retroceder y en todas las otras variables en el conjunto de datos.

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10)) 
# fits a model using x1 and x2 
fit <- lm(y ~ ., data = df) 
# Removes the column containing x1 so regression on x2 only 
fit <- lm(y ~ ., data = df[, -2]) 
+0

¿Hay una manera de excluir más de una columna de esta manera? – soandos

+1

@soandos df [, - c (3,6,7)] excluirá las columnas 3ª, 6ª y 7ª. – Dason

2

Existe una alternativa a la respuesta de Dason, para cuando desea especificar las columnas, excluir, por nombre. Que es usar subset(), y especificar el select argumento:

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10)) 
fit = lm(y ~ ., data = subset(df, select=-x1)) 

Tratar de utilizar data[,-c("x1")] falla con "argumento no válido al operador unitario".

Además, puede extenderse a la exclusión de varias columnas: subset(df, select = -c(x1,x2))

y todavía se puede utilizar columnas numéricas:

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10)) 
fit = lm(y ~ ., data = subset(df, select = -2)) 

(que es equivalente a subset(df, select=-x1) porque x1 es la segunda columna.)

Naturalmente, también puede usar esto para especificar las columnas a que incluyen.

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10)) 
fit = lm(y ~ ., data = subset(df, select=c(y,x2))) 

(Sí, esto es equivalente a lm(y ~ x2, df) pero es distinto si estuviera a continuación, va a utilizar step(), por ejemplo.)

Cuestiones relacionadas