vectores seleccionar repeticiones listas for eliminar creacion contar concatenar columnas r list vector grouping

seleccionar - ¿Cómo agrupar un vector en una lista de vectores?



listas en r (2)

Tengo algunos datos que se parecen a esto (datos falsos por ejemplo):

dressId color 6 yellow 9 red 10 green 10 purple 10 yellow 12 purple 12 red

donde el color es un vector de factores. No se garantiza que todos los niveles posibles del factor aparezcan realmente en los datos (por ejemplo, el color "azul" también podría ser uno de los niveles).

Necesito una lista de vectores que agrupen los colores disponibles de cada vestido:

[[1]] yellow [[2]] red [[3]] green purple yellow [[4]] purple red

Preservar las identificaciones de los vestidos sería agradable (por ejemplo, un marco de datos donde esta lista es la segunda columna y los ID son los primeros), pero no es necesario.

Escribí un bucle que pasa por la fila del cuadro de datos para la fila, y aunque la próxima ID es la misma, agrega el color a un vector. (Estoy seguro de que los datos están ordenados por ID). Cuando la identificación en la primera columna cambia, agrega el vector a una lista:

result <- NULL while(blah blah) { some code which creates the vector called "colors" result[[dressCounter]] <- colors dressCounter <- dressCounter + 1 }

Después de luchar para que todas las variables de recuento necesarias fueran correctas, descubrí para mi sorpresa que no funciona. La primera vez, los colors son

[1] yellow Levels: green yellow purple red blue

y se fuerza en un entero, por lo que el result convierte en 2 .

En la segunda repetición de bucle, los colors solo contienen rojo, y el result convierte en un vector entero simple, [1] 2 4 .

En la tercera repetición, los colors son un vector ahora,

[1] green purple yellow Levels: green yellow purple red blue

y obtengo

result[[3]] <- colors

Error en el resultado [[3]] <- colores:
más elementos suministrados que hay para reemplazar

¿Qué estoy haciendo mal? ¿Hay alguna manera de inicializar el result para que no se convierta en un vector numérico, sino que se convierta en una lista de vectores?

Además, ¿hay alguna otra manera de hacer todo el asunto que no sea "rodar el mío"?


Además de split , debes considerar aggregate . Use c o I como la función de agregación para obtener su columna de list :

out <- aggregate(color ~ dressId, mydf, c) out # dressId color # 1 6 yellow # 2 9 red # 3 10 green, purple, yellow # 4 12 purple, red str(out) # ''data.frame'': 4 obs. of 2 variables: # $ dressId: int 6 9 10 12 # $ color :List of 4 # ..$ 0: chr "yellow" # ..$ 1: chr "red" # ..$ 2: chr "green" "purple" "yellow" # ..$ 3: chr "purple" "red" out$color # $`0` # [1] "yellow" # # $`1` # [1] "red" # # $`2` # [1] "green" "purple" "yellow" # # $`3` # [1] "purple" "red"

Nota : Esto funciona incluso si la variable "color" es un factor , como en los datos de muestra de Ben (me perdí ese punto cuando publiqué la respuesta anterior) pero necesita usar I como la función de agregación en lugar de c :

out <- aggregate(color ~ dressId, d, I) str(out) # ''data.frame'': 4 obs. of 2 variables: # $ dressId: num 6 9 10 12 # $ color :List of 4 # ..$ 0: Factor w/ 6 levels "red","orange",..: 3 # ..$ 1: Factor w/ 6 levels "red","orange",..: 1 # ..$ 2: Factor w/ 6 levels "red","orange",..: 4 6 3 # ..$ 3: Factor w/ 6 levels "red","orange",..: 6 1 out$color # $`0` # [1] yellow # Levels: red orange yellow green blue purple # # $`1` # [1] red # Levels: red orange yellow green blue purple # # $`2` # [1] green purple yellow # Levels: red orange yellow green blue purple # # $`3` # [1] purple red # Levels: red orange yellow green blue purple

Extrañamente, sin embargo, la pantalla predeterminada muestra los valores enteros:

out # dressId color # 1 6 3 # 2 9 1 # 3 10 4, 6, 3 # 4 12 6, 1


split.data.frame es una buena forma de organizar esto; luego extrae el componente de color.

d <- data.frame(dressId=c(6,9,10,10,10,12,12), color=factor(c("yellow","red","green", "purple","yellow", "purple","red"), levels=c("red","orange","yellow", "green","blue","purple")))

Creo que la versión que quieres es en realidad esta:

ss <- split.data.frame(d,d$dressId)

Puede obtener algo más parecido a la lista que solicitó extrayendo el componente de color:

lapply(ss,"[[","color")