如何在 R 的 lm 中将 "weights" 列名作为变量传递?
How to pass "weights" column name as a variable in R's lm?
下面的代码使用 R 的 lm 创建一个线性模型,然后创建一个带有权重列的加权模型。最后,我尝试使用变量 weight_col
传递权重列名称,但失败了。我很确定它正在df中寻找“weight_col”,然后调用者的环境,找到一个长度为1的变量,并且长度不匹配。
如何使用 weight_col 作为 df 中权重列的名称?
我尝试了多种组合,但均未成功。
> df <- data.frame(
x=c(1,2,3),
y=c(4,5,7),
w=c(1,3,5)
)
> lm(y ~ x, data=df)
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
2.333 1.500
> lm(y ~ x, data=df, weights=w)
Call:
lm(formula = y ~ x, data = df, weights = w)
Coefficients:
(Intercept) x
1.947 1.658
> weight_col <- 'w'
> lm(y ~ x, data=df, weights=weight_col)
Error in model.frame.default(formula = y ~ x, data = df, weights = weight_col, :
variable lengths differ (found for '(weights)')
> R.version.string
[1] "R version 3.6.3 (2020-02-29)"
我们可以使用[[
来提取列的值
lm(y ~ x, data=df, weights=df[[weight_col]])
或者用tidyverse
library(dplyr)
df %>%
summarise(model = list(y ~ x, weights = .data[[weight_col]]))
您的第一个示例 weights = w
,它使用 non-standard 评估在 df
的上下文中查找 w
。到目前为止,这对于交互使用来说是正常的。
您的第二组是 weights = weight_col
,解析为 weights = "w"
,这是非常不同的。 R 的 non-standard(或标准)评估没有任何意义。
正如我在评论中所说,使用 standard-evaluation 形式和 [[
。
lm(y ~ x, data=df, weights=df[[weight_col]])
# Call:
# lm(formula = y ~ x, data = df, weights = df[[weight_col]])
# Coefficients:
# (Intercept) x
# 1.947 1.658
您可以将数据框名称与提取器运算符一起使用:
lm(y ~ x, data = df, weights = df[[weight_col]])
或者你可以使用函数 get
:
lm(y ~ x, data = df, weights = get(weight_col))
下面的代码使用 R 的 lm 创建一个线性模型,然后创建一个带有权重列的加权模型。最后,我尝试使用变量 weight_col
传递权重列名称,但失败了。我很确定它正在df中寻找“weight_col”,然后调用者的环境,找到一个长度为1的变量,并且长度不匹配。
如何使用 weight_col 作为 df 中权重列的名称?
我尝试了多种组合,但均未成功。
> df <- data.frame(
x=c(1,2,3),
y=c(4,5,7),
w=c(1,3,5)
)
> lm(y ~ x, data=df)
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
2.333 1.500
> lm(y ~ x, data=df, weights=w)
Call:
lm(formula = y ~ x, data = df, weights = w)
Coefficients:
(Intercept) x
1.947 1.658
> weight_col <- 'w'
> lm(y ~ x, data=df, weights=weight_col)
Error in model.frame.default(formula = y ~ x, data = df, weights = weight_col, :
variable lengths differ (found for '(weights)')
> R.version.string
[1] "R version 3.6.3 (2020-02-29)"
我们可以使用[[
来提取列的值
lm(y ~ x, data=df, weights=df[[weight_col]])
或者用tidyverse
library(dplyr)
df %>%
summarise(model = list(y ~ x, weights = .data[[weight_col]]))
您的第一个示例 weights = w
,它使用 non-standard 评估在 df
的上下文中查找 w
。到目前为止,这对于交互使用来说是正常的。
您的第二组是 weights = weight_col
,解析为 weights = "w"
,这是非常不同的。 R 的 non-standard(或标准)评估没有任何意义。
正如我在评论中所说,使用 standard-evaluation 形式和 [[
。
lm(y ~ x, data=df, weights=df[[weight_col]])
# Call:
# lm(formula = y ~ x, data = df, weights = df[[weight_col]])
# Coefficients:
# (Intercept) x
# 1.947 1.658
您可以将数据框名称与提取器运算符一起使用:
lm(y ~ x, data = df, weights = df[[weight_col]])
或者你可以使用函数 get
:
lm(y ~ x, data = df, weights = get(weight_col))