2015-03-09 8 views
10

Perché non funziona?Perché a volte devo racchiudere `.` in` data.frame() `per un argomento con nome in` do`?

data.frame(x = rnorm(100)) %>% do(df = .)

Messaggio di errore:

Error in do_(.data, .dots = lazyeval::lazy_dots(...)) : 
    argument ".data" is missing, with no default 

Invece, devo racchiudere il . in data.frame():

data.frame(x = rnorm(100)) %>% do(df = data.frame(.)) 

In alternativa, questo funziona anche:

data.frame(x = rnorm(100)) %>% do(., df = .) 

L'esempio, ovviamente, non ha senso. Ma può essere utile salvare lo data.frame come variabile di lista quando si lavora con group_by.

Qui è un problema più complesso che sembra essere correlato:

library("MatchIt") 
n <- 5000 
DF <- data.frame(
    x1 = rnorm(n), 
    x2 = rbinom(n, 1, 0.5), 
    group = rbinom(n, 1, 0.5), 
    D = rbinom(n, 1, 0.5)) 

Ora, questo produce un errore:

DF %>% 
    group_by(group) %>% 
    do(m = matchit(D ~ x1, data = ., exact = "x2")) 

ma funziona quando allego il . in data.frame():

DF %>% 
    group_by(group) %>% 
    do(m = matchit(D ~ x1, data = data.frame(.), exact = "x2")) 

Non sono sicuro se il secondo esempio con matchit è correlato ma in entrambi i casi devo includere lo . in data.frame().

sessionInfo()

> sessionInfo() 
R version 3.1.1 (2014-07-10) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base 

other attached packages: 
[1] MatchIt_2.4-21 MASS_7.3-33 dplyr_0.4.1 Defaults_1.1-1 

loaded via a namespace (and not attached): 
[1] assertthat_0.1 DBI_0.3.1  lazyeval_0.1.10 magrittr_1.5 parallel_3.1.1 Rcpp_0.11.4  tools_3.1.1 
+0

Il comando 'mtcars%>% group_by (cil)%>% do (mod = lm (mpg ~ vs, data =.))' Funziona? –

+0

Sì, funziona. Nel secondo esempio, il problema si verifica anche in diverse circostanze particolari (quando utilizzo l'argomento 'exact'). Parte delle mie domande quando e perché devo includere '.' in' data.frame() 'o se si tratta di un problema con il mio setup. Grazie! – user2503795

+2

Il secondo problema non è in realtà correlato al primo, poiché non è correlato a 'do': è perché' matchit' non funziona su 'tbl_df's. Prova 'matchit (D ~ x1, data = tbl_df (DF), exact =" x2 ")', ad esempio - ottiene lo stesso errore. –

risposta

3

La differenza deriva dal magrittr modo di catene scissione.

expr1 <- substitute(data.frame(x = rnorm(100)) %>% do(df = .)) 
expr2 <- substitute(data.frame(x = rnorm(100)) %>% do(df = (.))) 

magrittr:::split_chain(expr1) 
magrittr:::split_chain(expr2) 
Problemi correlati