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.



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.


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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.