Cómo expandir el marco de datos en R

15

Estoy teniendo el siguiente problema mientras hago un análisis con R.

Tengo un marco de datos como este:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

y necesitaría "expandirlo" (no estoy seguro si es el término correcto) para ser así:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

etc.

Por lo tanto, toma el valor del par Persona 1 y A (en este ejemplo, 3) y forma tres filas con la Persona 1 y A y lo hace para cada Persona - Grupo - combinación. No puedo encontrar buenas palabras para buscar en línea.

Juha-Matti S.
fuente
Pruebe la reshape()función
invitado
Debería explorar el reshape2paquete en R. También podría ayudar a dput2 marcos de datos de ejemplo: uno con la entrada y otro con la salida.
Zach
Proporcioné una respuesta, pero supongo que es más una pregunta de programación R que una pregunta estadística, por lo que tal vez debería migrarse a otro lugar.
Gala
Gracias Gaël por responder y ayudar con el formato de mi pregunta.
Juha-Matti S.

Respuestas:

10

Si bien es un paquete muy útil, creo que la remodelación es excesiva en este caso, el representante puede hacer el trabajo.

Aquí hay algunos datos de ejemplo:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Ahora, para "expandirlo":

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

No pude encontrar una manera de trabajar directamente en el marco de datos desde la parte superior de mi cabeza, así que estoy trabajando en cada variable por separado y luego volver a ensamblarlas, lo cual es un poco feo, pero debería estar bien siempre y cuando se preocupe de usar siempre La misma variable para los recuentos.

Gala
fuente
77
¿Qué tal esto df[rep(seq_len(nrow(df)), df$count), 1:2]?
chl
@chl, señor, usted es brillante!
Chris
15

Puede usar la función inestable del paquete de remodelación.

Dado el df anterior (por @ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B
Etienne Low-Décarie
fuente
untablehace exactamente lo que mencioné en mi comentario :-) ¡Gracias por recordarme esa función!
chl
1

Y a uncountpartir de tidyrahora da el mismo resultado que el anterior.

library(tidyr)
df %>% uncount(Count)
Joe
fuente