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.