unicos - Replicar cada fila de data.frame y especificar el número de repeticiones para cada fila
reemplazar valores data frame r (5)
Aquí hay una solución:
df.expanded <- df[rep(row.names(df), df$freq), 1:2]
Resultado:
var1 var2
1 a d
2 b e
2.1 b e
3 c f
3.1 c f
3.2 c f
df <- data.frame(var1=c(''a'', ''b'', ''c''), var2=c(''d'', ''e'', ''f''), freq=1:3)
¿Cuál es la forma más sencilla de expandir las dos primeras columnas de data.frame anterior, de modo que cada fila aparezca el número de veces especificado en la columna ''freq''?
En otras palabras, vaya de esto:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
A esto:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
En caso de que tenga que realizar esta operación en data.frames de gran tamaño, recomendaría convertirla en una data.table y utilizar la siguiente, que debería ejecutarse mucho más rápido:
library(data.table)
dt <- data.table(df)
dt.expanded <- dt[ ,list(freq=rep(1,freq)),by=c("var1","var2")]
dt.expanded[ ,freq := NULL]
dt.expanded
Vea cuánto más rápido es esta solución:
df <- data.frame(var1=1:2e3, var2=1:2e3, freq=1:2e3)
system.time(df.exp <- df[rep(row.names(df), df$freq), 1:2])
## user system elapsed
## 4.57 0.00 4.56
dt <- data.table(df)
system.time(dt.expanded <- dt[ ,list(freq=rep(1,freq)),by=c("var1","var2")])
## user system elapsed
## 0.05 0.01 0.06
La solución de @ neilfws funciona muy bien para data.frame
s, pero no para data.table
s ya que carecen de la propiedad row.names
. Este enfoque funciona para ambos:
df.expanded <- df[rep(seq(nrow(df)), df$freq), 1:2]
El código para data.table
es un poco más limpio:
# convert to data.table by reference
setDT(df)
df.expanded <- df[rep(seq(.N), freq), !"freq"]
Use expandRows()
desde el paquete splitstackshape
:
library(splitstackshape)
expandRows(df, "freq")
La sintaxis simple, muy rápida, funciona en data.frame
o data.table
.
Resultado:
var1 var2
1 a d
2 b e
2.1 b e
3 c f
3.1 c f
3.2 c f
vieja pregunta, nuevo verbo en tidyverse:
library(tidyr) # version >= 0.8.0
df <- data.frame(var1=c(''a'', ''b'', ''c''), var2=c(''d'', ''e'', ''f''), freq=1:3)
df %>%
uncount(freq)
var1 var2
1 a d
2 b e
2.1 b e
3 c f
3.1 c f
3.2 c f