2015-08-27 5 views
8

Quando uso broom:::glance nel seguente modo:Usando `scopa ::: glance` in un flusso di lavoro dplyr con un singolo oggetto lm fallisce

library(dplyr) 
library(broom) 
mtcars %>% do(model = lm(mpg ~ wt, .)) %>% glance(model) 

ottengo

Error in complete.cases(x) : invalid 'type' (list) of argument 

Tuttavia, quando ho aggiungere un group_by:

mtcars %>% group_by(am) %>% do(model = lm(mpg ~ wt, .)) %>% glance(model) 

non dare i risultati sperati:

Source: local data frame [2 x 12] 
Groups: am 

    am r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual 
1 0  0.589   0.565 2.53  24.4 1.25e-04 2 -43.5 93.1 95.9 108.7   17 
2 1  0.826   0.810 2.69  52.3 1.69e-05 2 -30.2 66.4 68.1  79.3   11 

Mi manca qualcosa qui, o è un errore in dplyr/broom?

+0

Potrebbe essere correlato a un elenco di lunghezza 1? 'library (tidyr); unnest (lista (mtcars, mtcars), gr)%>% group_by (gr)%>% do (modello = lm (mpg ~ wt,.))%>% glance (modello)' funziona – akrun

+0

Sembra infatti che non funzioni quando l'elenco di output di 'do' è solo un elenco di lunghezza uno. –

+0

Buona cattura: è perché 'do' su un tbl_df non raggruppato non restituisce un' rowwise_df', quindi il metodo 'glance.rowwise_df' non viene applicato. Ho aperto [un problema per questo] (https://github.com/dgrtwo/broom/issues/77) e l'ho risolto a breve! –

risposta

8

Questo perché do, quando eseguito su un tavolo separati, determina una tbl_df piuttosto che un rowwise_df, significa scopa usato un metodo diverso. Ho fixed this nella sua ultima versione di sviluppo, in modo tale che ora è possibile farlo:

mtcars %>% do(model = lm(mpg ~ wt, .)) %>% glance(model) 
#> r.squared adj.r.squared sigma statistic  p.value df logLik 
#> 1 0.7528328  0.7445939 3.045882 91.37533 1.293959e-10 2 -80.01471 
#>  AIC  BIC deviance df.residual 
#> 1 166.0294 170.4266 278.3219   30 

Spero di avere questo sul CRAN (scopa 0.4) presto, oppure è possibile installare con devtools::install_github("dgrtwo/broom"). Nel frattempo, è possibile utilizzare una colonna di raggruppamento temporanea per ottenere il comportamento desiderato:

mtcars %>% 
    group_by(g = 1) %>% 
    do(model = lm(mpg ~ wt, .)) %>% 
    glance(model) 
#> Source: local data frame [1 x 12] 
#> Groups: g 
#> 
#> g r.squared adj.r.squared sigma statistic  p.value df logLik 
#> 1 1 0.7528328  0.7445939 3.045882 91.37533 1.293959e-10 2 -80.01471 
#> Variables not shown: AIC (dbl), BIC (dbl), deviance (dbl), df.residual 
#> (int) 
Problemi correlati