使用dplyr行绑定列表列

在为每个模型添加标识符后,我想找到一种更好的方法来将任意数量的回归结果绑定在一起。下面的代码是我当前的解决方案,但对于大量回归来说太手动了。这是一个更大的整洁工作流程的一部分,因此内部的解决方案tidyverse是首选,但任何工作都很好。谢谢

library(tidyverse)
library(broom)

model_dat=mtcars %>% 
do(lm_1 = tidy(lm(disp~ wt*vs, data = .),conf.int=T),
   lm_2=tidy(lm(cyl ~ wt*vs, data = .),conf.int=T ),
   lm_3=tidy(lm(mpg ~ wt*vs, data = .),conf.int=T ))
df=model_dat %>%
    select(lm_1) %>%
    unnest(c(lm_1)) %>%
    mutate(model="one") %>% 
    select(model,term,estimate,p.value:conf.high) %>%
    bind_rows(
        model_dat %>% 
            select(lm_2) %>% 
            unnest(c(lm_2)) %>% 
            mutate(model="two") %>% 
            select(model,term,estimate,p.value:conf.high)) %>%
    bind_rows(
        model_dat %>% 
            select(lm_3) %>% 
            unnest(c(lm_3)) %>% 
            mutate(model="three") %>% 
            select(model,term,estimate,p.value:conf.high))

回答

它可以是与更容易map2跨越列即循环和相应的english为列的序列单词plucklist元素,创建与第二个参数即“模式”列engish字(.y),select感兴趣的列,并且通过指定建立一个单一的数据集_dfrmap

library(purrr)
library(english)
library(dplyr)
library(broom)
map2_dfr(model_dat, as.character(english(seq_along(model_dat))), 
      ~ .x  %>% 
           pluck(1) %>%
           mutate(model = .y) %>% 
           select(model, term, estimate, p.value:conf.high) )

-输出

# A tibble: 12 x 6
#   model term        estimate  p.value conf.low conf.high
#   <chr> <chr>          <dbl>    <dbl>    <dbl>     <dbl>
# 1 one   (Intercept) -70.0    1.55e- 1 -168.       28.2  
# 2 one   wt          102.     8.20e- 9   76.4     128.   
# 3 one   vs           31.2    6.54e- 1 -110.      172.   
# 4 one   wt:vs       -36.7    1.10e- 1  -82.2       8.82 
# 5 two   (Intercept)   4.31   1.28e- 5    2.64      5.99 
# 6 two   wt            0.849  4.90e- 4    0.408     1.29 
# 7 two   vs           -2.19   7.28e- 2   -4.59      0.216
# 8 two   wt:vs         0.0869 8.20e- 1   -0.689     0.862
# 9 three (Intercept)  29.5    6.55e-12   24.2      34.9  
#10 three wt           -3.50   2.33e- 5   -4.92     -2.08 
#11 three vs           11.8    4.10e- 3    4.06     19.5  
#12 three wt:vs        -2.91   2.36e- 2   -5.40     -0.419

或者使用summarisewith acrossunclass然后绑定 withbind_rows

model_dat %>% 
       summarise(across(everything(), ~ {
         # // get the column name
         nm1 <- cur_column()
         # // extract the list element (.[[1]])
         list(.[[1]] %>% 
            # // create new column by extracting the numeric part
            mutate(model = english(readr::parse_number(nm1))) %>%
            # // select the subset of columns, wrap in a list
            select(model, term, estimate, p.value:conf.high))
         }
         )) %>%
        # // unclass to list
        unclass %>%
        # // bind the list elements
        bind_rows

-输出

# A tibble: 12 x 6
#   model     term        estimate  p.value conf.low conf.high
#   <english> <chr>          <dbl>    <dbl>    <dbl>     <dbl>
# 1 one       (Intercept) -70.0    1.55e- 1 -168.       28.2  
# 2 one       wt          102.     8.20e- 9   76.4     128.   
# 3 one       vs           31.2    6.54e- 1 -110.      172.   
# 4 one       wt:vs       -36.7    1.10e- 1  -82.2       8.82 
# 5 two       (Intercept)   4.31   1.28e- 5    2.64      5.99 
# 6 two       wt            0.849  4.90e- 4    0.408     1.29 
# 7 two       vs           -2.19   7.28e- 2   -4.59      0.216
# 8 two       wt:vs         0.0869 8.20e- 1   -0.689     0.862
# 9 three     (Intercept)  29.5    6.55e-12   24.2      34.9  
#10 three     wt           -3.50   2.33e- 5   -4.92     -2.08 
#11 three     vs           11.8    4.10e- 3    4.06     19.5  
#12 three     wt:vs        -2.91   2.36e- 2   -5.40     -0.419


以上是使用dplyr行绑定列表列的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>