我们不能将管道链输出传递给线性模型 lm() 点占位符吗?
Can we not pass pipe chain output into linear model lm() dot placeholder?
我想知道如何将管道操作的输出直接传递到 lm()
。
例如,我可以将下面的 yay
向量直接传递给 lm()
。
set.seed(40)
yay = c(rnorm(15), exp(rnorm(15)), runif(20, min = -3, max = 0))
lm(yay~1)
#> Call:
#> lm(formula = yay ~ 1)
#> Coefficients:
#> (Intercept)
#> -0.09522
但是当我尝试这样的操作时,它抛出了一个错误。
library(tidyverse)
library(palmerpenguins)
data("penguins")
filter_penguins <- penguins %>% filter(species == "Adelie")
filter_penguins %>%
filter(island == "Torgersen") %>%
select(bill_length_mm) %>%
pull() %>%
lm(. ~ 1)
#> Error in formula.default(object, env = baseenv()) : invalid formula
我还尝试将 pull()
输出保存到对象中,然后将其输入到 lm()
,它有效。但是为什么点占位符不能这样工作?
非常感谢。
编辑:我意识到我误读了这个问题,并认为 OP 想将变量名作为公式的一部分传递,而不是传递数据集本身。无论如何,我会把这个 post 留在原处。
它不会工作,因为 lm
的第一个参数将是管道输入的任何内容,这不是正确的公式(如错误提示的那样)。
使用你的例子,假装管道值是“var”,然后
"var" %>%
lm(. ~ 1)
会被评估为
lm(formula = "var", . ~ 1)
所以 . ~ 1
部分不是公式参数的一部分。不过,您可以使用 paste0
或类似的方法构建公式。例如,这会起作用:
"mpg" %>%
paste0(" ~ .") %>%
lm(data = mtcars)
此问题是管道内的 lm()
将给定的数据视为 formula
参数。因此,数据放错了地方。尝试:
filter_penguins %>%
filter(island == "Torgersen") %>%
select(bill_length_mm) %>%
lm(data = ., pull(.) ~ 1)
我想知道如何将管道操作的输出直接传递到 lm()
。
例如,我可以将下面的 yay
向量直接传递给 lm()
。
set.seed(40)
yay = c(rnorm(15), exp(rnorm(15)), runif(20, min = -3, max = 0))
lm(yay~1)
#> Call:
#> lm(formula = yay ~ 1)
#> Coefficients:
#> (Intercept)
#> -0.09522
但是当我尝试这样的操作时,它抛出了一个错误。
library(tidyverse)
library(palmerpenguins)
data("penguins")
filter_penguins <- penguins %>% filter(species == "Adelie")
filter_penguins %>%
filter(island == "Torgersen") %>%
select(bill_length_mm) %>%
pull() %>%
lm(. ~ 1)
#> Error in formula.default(object, env = baseenv()) : invalid formula
我还尝试将 pull()
输出保存到对象中,然后将其输入到 lm()
,它有效。但是为什么点占位符不能这样工作?
非常感谢。
编辑:我意识到我误读了这个问题,并认为 OP 想将变量名作为公式的一部分传递,而不是传递数据集本身。无论如何,我会把这个 post 留在原处。
它不会工作,因为 lm
的第一个参数将是管道输入的任何内容,这不是正确的公式(如错误提示的那样)。
使用你的例子,假装管道值是“var”,然后
"var" %>%
lm(. ~ 1)
会被评估为
lm(formula = "var", . ~ 1)
所以 . ~ 1
部分不是公式参数的一部分。不过,您可以使用 paste0
或类似的方法构建公式。例如,这会起作用:
"mpg" %>%
paste0(" ~ .") %>%
lm(data = mtcars)
此问题是管道内的 lm()
将给定的数据视为 formula
参数。因此,数据放错了地方。尝试:
filter_penguins %>%
filter(island == "Torgersen") %>%
select(bill_length_mm) %>%
lm(data = ., pull(.) ~ 1)