operaciones agrupadas que dan como resultado una longitud no igual a 1 o una longitud de grupo en dplyr

No estoy seguro de qué función usar para hacer lo siguiente:

library(data.table) dt = data.table(a = 1:4, b = 1:2) dt[, rep(a[1], 3), by = b] # b V1 #1: 1 1 #2: 1 1 #3: 1 1 #4: 2 2 #5: 2 2 #6: 2 2 

Ambos summarise y mutate están contentos con esta longitud:

 library(dplyr) df = data.frame(a = 1:4, b = 1:2) df %.% group_by(b) %.% summarise(rep(a[1], 3)) #Error: expecting a single value df %.% group_by(b) %.% mutate(rep(a[1], 3)) #Error: incompatible size (3), expecting 2 (the group size) or 1 

En la versión 0.2 de dplyr , puede hacer esto usando el operador do :

 > df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3))) #Source: local data frame [6 x 2] #Groups: b # # ba #1 1 1 #2 1 1 #3 1 1 #4 2 2 #5 2 2 #6 2 2 

Si bien la respuesta de @ beginneR funciona, no parece ser un sustituto real del comportamiento de los datos. Considerar:

 df < - data.frame(a = 1, b = rep(1:1e4, 2)) dt <- data.table(df) microbenchmark(times=5, dt[, rep(a[1], 3), by = b], df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3))) ) 

tiene la implementación dplyr > dplyr más lenta.

 Unit: milliseconds expr min lq median uq dt[, rep(a[1], 3), by = b] 13.14318 13.70248 14.60524 15.26676 df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3))) 3269.40731 3359.11614 3583.19430 3736.67162 

Tal vez hay una mejor manera de hacer esto con do que no requiere llamar a data.frame cada uno? Además, la syntax está un poco involucrada para lo que es algo muy simple en data.table .

De lo contrario, según el enlace de problema de Hadley , parece que se espera implementarlo en dplyr en 3.1, que parece ser la próxima versión.