【问题标题】:Lost column name when applying lm with summarise/across将 lm 与 summarise/across 一起应用时丢失列名
【发布时间】:2021-04-20 03:08:27
【问题描述】:

我想使用 summarise/acrosslm 来拟合使用 tibble 中不同列的回归。像这样:

library(tidyverse)
library(broom)

fits <- tibble(mtcars) %>% 
  summarise(across(c(vs, am), ~list(tidy(lm(wt ~ .x + mpg))))) 

但是作为'.x' 传递到lm 的列最终在回归输出中标记为.x

fits %>% unnest(vs)

# A tibble: 3 x 6
  term        estimate std.error statistic  p.value am              
  <chr>          <dbl>     <dbl>     <dbl>    <dbl> <list>          
1 (Intercept)   6.10      0.353     17.3   8.36e-17 <tibble [3 × 5]>
2 .x            0.0738    0.239      0.308 7.60e- 1 <tibble [3 × 5]>
3 mpg          -0.145     0.0200    -7.24  5.63e- 8 <tibble [3 × 5]>

如果我即时构建lm 公式并使用cur_column(),我可以保留名称,但这感觉很笨拙:

tibble(mtcars) %>% 
  summarise(across(c(vs, am), 
           ~list(tidy(lm(formula(paste0("wt ~ ", cur_column(), " + mpg"))))))) %>% 
  unnest(vs)

# A tibble: 3 x 6
  term        estimate std.error statistic  p.value am              
  <chr>          <dbl>     <dbl>     <dbl>    <dbl> <list>          
1 (Intercept)   6.10      0.353     17.3   8.36e-17 <tibble [3 × 5]>
2 vs            0.0738    0.239      0.308 7.60e- 1 <tibble [3 × 5]>
3 mpg          -0.145     0.0200    -7.24  5.63e- 8 <tibble [3 × 5]>

我希望输出正确使用.x 的真实列名,而不必执行此解决方法,但仍使用summarise/across 主题,不包含map.

似乎这应该是可能的。有什么建议吗?

*从@akrun 的回答中复制我的评论以澄清我在寻找什么:

我真正想知道的是,在 summarise/across 操作中保留的列名是否可以直接在 lm.xml 中引用。像 {{.x}} 或 rlang::as_name(.x) 之类的东西。我的意思是,我知道那些不起作用,但似乎应该保留名称信息,除了 cur_column 中的字符串版本。

【问题讨论】:

  • 我不明白。您希望更改已有答案的哪一部分?
  • @RonakShah 我从 akrun 的帖子中复制了我的评论,我希望这能更多地解释我在寻找什么。但话又说回来,如果您和 akrun 都没有看到明显的方法来做我想做的事,那可能只是我正在使用的 dplyr 方法中实际上不可用。

标签: r dplyr lm broom


【解决方案1】:

可以使用reformulate 使其更短

library(dplyr)
library(broom)
library(tidyr)
tibble(mtcars) %>%
   summarise(across(c(vs, am), ~       
     list(tidy(lm(reformulate(c(cur_column(), "mpg"), "wt")))))) %>% 
   unnest(vs)

-输出

# A tibble: 3 x 6
#  term        estimate std.error statistic  p.value am              
#  <chr>          <dbl>     <dbl>     <dbl>    <dbl> <list>          
#1 (Intercept)   6.10      0.353     17.3   8.36e-17 <tibble [3 × 5]>
#2 vs            0.0738    0.239      0.308 7.60e- 1 <tibble [3 × 5]>
#3 mpg          -0.145     0.0200    -7.24  5.63e- 8 <tibble [3 × 5]>

【讨论】:

  • 谢谢@akrun。确实,这样更干净一些。我真正想知道的是,在summarise/across 操作中保留的列名是否可以直接在lm 中引用。类似于{{.x}}rlang::as_name(.x)。我的意思是,我知道那些不起作用,但似乎应该保留名称信息,除了 cur_column 中的字符串版本。至少在我看来,这似乎是一件合理的事情!
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2012-01-19
  • 2021-05-16
  • 2019-11-19
  • 2019-11-03
相关资源
最近更新 更多