valores unicos tablas studio registros reemplazar frecuencias filas eliminar duplicados datos data contar r dataframe replicate

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