2014-09-24 5 views
6

Sto provando a racchiudere qualche magia dplyr all'interno di una funzione per produrre un data.frame che poi stampo con xtable.Uso di dplyr summarise_each() con is.na()

L'obiettivo finale è quello di avere una versione dplyr di this lavorare, e leggendo in giro ho trovato molto utile summarise_each() funzione che dopo sottoinsiemi con regroup() (dato che si tratta di una funzione) posso utilizzare per ottenere tutte le colonne analizzati .

Il problema che ho incontrato (finora) è con chiamando is.na() dall'interno summarise_each(funs(is.na)) come mi è stato detto Error: expecting a single value.

Sono volutamente non distacco mia funzione appena ancora, ma un esempio minimo segue (NB - Questo utilizza group_by() mentre nella mia funzione sostituisco questo con regroup()) ...

library(dplyr) 
library(magrittr) 
> t <- data.frame(grp = rbinom(10, 1, 0.5), 
       a = as.factor(round(rnorm(10))), 
       b = rnorm(10), 
       c = rnorm(10)) 
t %>% 
group_by(grp) %>% ## This is replaced with regroup() in my function 
summarise_each(funs(is.na)) 
Error: expecting a single value 

L'esecuzione di questo fallisce , e la sua la chiamata a is.na() che è il problema dal momento che se io invece lavoro fuori il numero di osservazioni in ogni (necessario per ricavare la percentuale di mancante) funziona ...

> t %>% 
group_by(grp) %>% ## This is replaced with regroup() in my function 
summarise_each(funs(length)) 
Source: local data frame [2 x 4] 

    grp a b c 
1 0 8 8 8 
2 1 2 2 2 

Il vero problema è però che non ho bisogno solo is.na() all'interno di ogni colonna, ma il sum(is.na()) come per l'esempio collegato così che cosa mi piacerebbe davvero è ...

> t %>% 
group_by(grp) %>% ## This is replaced with regroup() in my function 
summarise_each(funs(propmiss = sum(is.na)/length)) 

Ma il problema è che doesn sum(is.na) 't lavorare come mi aspetto che (probabilmente perché la mia aspettativa è sbagliato!) ...

> t %>% 
group_by(grp) %>% ## This is replaced with regroup() in my function 
summarise_each(funs(nmiss = sum(is.na))) 
Error in sum(.Primitive("is.na")) : invalid 'type' (builtin) of argument 

ho provato a chiamare is.na() esplicitamente con le staffe, ma anche quello restituisce un errore ...

> t %>% 
+ group_by(grp) %>% ## This is replaced with regroup() in my function 
+ summarise_each(funs(nmiss  = sum(is.na()))) 
Error in is.na() : 0 arguments passed to 'is.na' which requires 1 

Qualsiasi consiglio o suggerimento alla documentazione sarebbe molto ben accolto.

Grazie,

slackline

+0

+1 per un'icona impressionante –

risposta

8

Ecco una possibilità, testato su un piccolo set di dati con una certa NA:

df <- data.frame(a = rep(1:2, each = 3), 
       b = c(1, 1, NA, 1, NA, NA), 
       c = c(1, 1, 1, NA, NA, NA)) 

df 
# a b c 
# 1 1 1 1 
# 2 1 1 1 
# 3 1 NA 1 
# 4 2 1 NA 
# 5 2 NA NA 
# 6 2 NA NA 


df %>% 
    group_by(a) %>% 
    summarise_each(funs(sum(is.na(.))/length(.))) 
# a   b c 
# 1 1 0.3333333 0 
# 2 2 0.6666667 1 

E perché hai chiesto puntatori a documentazione: La . si riferisce a ciascuna parte dei dati e viene utilizzato in alcuni esempi in ?summarize_each. È descritto nella sezione Argomenti di ?funs come "parametro fittizio" e viene utilizzato gli esempi . Il . viene anche descritto brevemente nella Argomenti sezione di ?do: "... È possibile utilizzare . per riferirsi al gruppo corrente"

+0

Eccellente, grazie per questo. Mi sono imbattuto in '.' prima perché era usato per denotare le variabili che dovrebbero essere convertite in fattori in' plyr() 'e l'ho visto usato in alcuni esempi' dplyr() '.La cosa che trovo confusa (ma ricorderò ora) è che molti comandi funzionano senza doverlo usare per riferirsi al gruppo corrente e non è sempre chiaro quali ne fanno/non ne hanno bisogno. Ad ogni modo, questo funziona alla grande nella funzione su cui sto lavorando, grazie ancora. – slackline