18

我有一个数据框,比如说 N+2 列。第一个只是日期(主要用于稍后绘制),第二个是一个变量,它对我想要计算的剩余 N 列的响应。我想一定有类似的东西

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

这行不通。我也尝试过但失败了

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

有什么想法吗?

4

3 回答 3

40

使用公式表示法y ~ .指定您要对数据集中所有其他变量的 y 进行回归。

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]) 
于 2012-08-16T16:37:10.570 回答
3

Dason 的答案有另一种选择,当您想按名称指定要排除的列时。它是使用subset(), 并指定select参数:

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

尝试使用data[,-c("x1")]失败,“一元运算符的参数无效”。

它可以扩展到排除多列:subset(df, select = -c(x1,x2))

您仍然可以使用数字列:

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

(这相当于subset(df, select=-x1)因为x1是第二列。)

当然,您也可以使用它来指定要包含的列。

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

lm(y ~ x2, df)(是的,例如,如果您当时打算使用,这相当于但不同step()。)

于 2016-06-17T10:32:32.657 回答
1

我对 R 相当陌生,但我找到了另一种方法来为数据框中的命名列执行此操作。假设您想使用除 column 之外的所有列运行回归x2,那么您将编写:

df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
# Removes the column containing x2 so regression on x1 only
model <- lm(Y ~ . - x2, data = df)
# to remove more columns (assuming there were more columns in the data frame)
model <- lm(Y ~ . - x2 - x3 - x4, data = df)

其余的答案都很老了,所以也许这是一个新功能,但它很整洁!

于 2019-06-10T19:09:01.883 回答