2015-12-31 12 views
6

Esiste un modo migliore per aggiungere righe all'interno dei gruppi group_by() rispetto all'utilizzo di bind_rows()? Ecco un esempio che è un po 'goffo:dplyr: aggiungi righe all'interno group_by groups

df <- data.frame(a=c(1,1,1,2,2), b=1:5) 

df %>% 
    group_by(a) %>% 
    do(bind_rows(data.frame(a=.$a[1], b=0), ., data.frame(a=.$a[1], b=10))) 

L'idea è che le colonne che stiamo già raggruppamento sulla potrebbe essere dedotta dai gruppi.

mi chiedevo se qualcosa di simile potrebbe funzionare invece:

df %>% 
    group_by(a) %>% 
    insert(b=0, .at=0) %>% 
    insert(b=10) 

Come append(), potrebbe default inserendo dopo tutti gli elementi esistenti, e potrebbe essere abbastanza intelligente per utilizzare valori di gruppo per le colonne non specificati. Forse utilizzare NA per colonne non di raggruppamento non specificate.

Esiste una sintassi conveniente esistente che ho perso o sarebbe utile?

+3

'df%>% group_by (a)%>% do (data.frame (b = c (0,. $ B, 10)))' sarebbe in un modo, se preferisci dplyr. – jazzurro

risposta

2

Ecco un approccio usando data.table:

library(data.table) 
setDT(df) 

rbind(df, expand.grid(b = c(0, 10), a = df[ , unique(a)]))[order(a, b)] 

A seconda del contesto attuale questa alternativa molto più semplice avrebbe funzionato troppo:

df[ , .(b = c(0, b, 10)), by = a] 

(e possiamo semplicemente usare c(0, b, 10) in j se don' t cura di mantenere il nome b)

Il primo ha il vantaggio che funzionerà anche se df ha più colonne - è sufficiente impostare fill = TRUE per .

Problemi correlati