2012-08-16 9 views
11

Mam ramkę danych z, powiedzmy, kolumny N + 2. Pierwszym z nich są tylko daty (używane głównie do późniejszego kreślenia), a drugi to zmienna, której odpowiedź na pozostałe kolumny N chciałbym obliczyć. Myślę, że musi być coś takiego, jakUżywanie lasera R na ramce danych z listą predyktorów

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

To nie działa. Ja również próbowałem i nie udało się

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

Wszelkie myśli?

Odpowiedz

26

Użycie notacji formuły y ~ . określa, że ​​chcesz regresować y dla wszystkich innych zmiennych w zbiorze danych.

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

Czy istnieje sposób, aby wykluczyć więcej niż jedną kolumnę w ten sposób? – soandos

+1

@soandos df [, - c (3,6,7)] spowoduje wykluczenie trzeciej, szóstej i siódmej kolumny. – Dason

2

Istnieje alternatywa dla odpowiedzi Dasona, ponieważ jeśli chcesz określić kolumny, wyklucz, według nazwy. To jest użycie subset() i określ select argument:

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

Próba użycia data[,-c("x1")] powiedzie się z "Invalid argument operatora jednoargumentowego".

może objąć wyłączeniem wielu kolumnach: subset(df, select = -c(x1,x2))

I nadal można używać kolumn numerycznych:

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

(co jest równoważne subset(df, select=-x1) ponieważ x1 jest 2. kolumna).

Oczywiście można również użyć tego do określenia kolumn do , takich jak.

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

(Tak, to jest równoważne lm(y ~ x2, df) ale różni jeśli były wtedy będzie za pomocą step(), na przykład.)

Powiązane problemy