15 votos

Cómo expandir un marco de datos en R

Tengo el siguiente problema al hacer 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 tendría que "ampliarlo" (no sé si es el término correcto) para que fuera así:

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

etc.

Así que toma el valor del par Persona 1 y A (en este ejemplo, 3) y hace tres filas con Persona 1 y A y lo hace para cada combinación Persona - Grupo. No puedo encontrar ninguna palabra buena para buscar en línea.

0 votos

Pruebe el reshape() función

0 votos

Debe explorar el reshape2 en R. También puede ser útil dput 2 marcos de datos de ejemplo: uno con la entrada y otro con la salida.

0 votos

Proporcioné una respuesta pero supongo que esto es más una pregunta de programación de R que una pregunta estadística, así que tal vez debería ser migrado a otro lugar.

15voto

Bittercoder Puntos 4692

Puede utilizar la función untable del paquete reshape.

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

0 votos

untable hace exactamente lo que mencioné en mi comentario :-) ¡Gracias por recordarme esa función!

10voto

Jared Farrish Puntos 120

Aunque es un paquete muy útil, creo que remodelar es una exageración en este caso, representante puede hacer el trabajo.

He aquí 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 "ampliarlo":

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 de la parte superior de mi cabeza por lo que estoy trabajando en cada variable por separado y luego volver a montarlos, que es un poco feo, pero debe estar bien, siempre y cuando usted tiene cuidado de usar siempre la misma variable para los recuentos.

7 votos

¿Qué te parece esto? df[rep(seq_len(nrow(df)), df$count), 1:2] ?

0 votos

@chl, ¡usted señor es brillante!

1voto

Drew Fowler Puntos 55

Y uncount de tidyr da ahora el mismo resultado que el anterior.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X