cómo propagar o emitir múltiples valores en r

Aquí está el conjunto de datos de juguete para este ejemplo:

data <- data.frame(x=rep(c("red","blue","green"),each=4), y=rep(letters[1:4],3), value.1 = 1:12, value.2 = 13:24) xy value.1 value.2 1 red a 1 13 2 red b 2 14 3 red c 3 15 4 red d 4 16 5 blue a 5 17 6 blue b 6 18 7 blue c 7 19 8 blue d 8 20 9 green a 9 21 10 green b 10 22 11 green c 11 23 12 green d 12 24 

¿Cómo puedo lanzar o expandir la variable y para producir el siguiente ancho de datos frame.frame:

  x a.value.1 b.value.1 c.value.1 d.value.1 a.value.2 b.value.2 c.value.2 d.value.2 1 blue 5 6 7 8 17 18 19 20 2 green 9 10 11 12 21 22 23 24 3 red 1 2 3 4 13 14 15 16 

Podríamos hacer esto usando dplyr/tidyr . starts_with('value') formato ‘datos’ de ‘ancho’ a ‘largo’ con gather especificando las columnas ( starts_with('value') ) para combinarlas con un par de columnas clave / valor (‘Var / Val’), unite el ‘Var ‘e’ y ‘columna para crear una sola columna’ Var1 ‘, y reconvertir a formato’ ancho ‘con spread .

  library(dplyr) library(tidyr) data %>% gather(Var, val, starts_with("value")) %>% unite(Var1,Var, y) %>% spread(Var1, val) # x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b value.2_c #1 blue 5 6 7 8 17 18 19 #2 green 9 10 11 12 21 22 23 #3 red 1 2 3 4 13 14 15 # value.2_d #1 20 #2 24 #3 16 

Actualizar

(Después de 6 meses)

Ahora es posible dcast de las columnas de valor múltiple a ancho con dcast de data.table_1.9.5 sin usar la melt . Podemos instalar la versión de desarrollo desde here

  library(data.table) dcast(setDT(data), x~y, value.var=c('value.1', 'value.2')) # x a_value.1 b_value.1 c_value.1 d_value.1 a_value.2 b_value.2 c_value.2 #1: blue 5 6 7 8 17 18 19 #2: green 9 10 11 12 21 22 23 #3: red 1 2 3 4 13 14 15 # d_value.2 #1: 20 #2: 24 #3: 16 

melt primero y luego dcast :

 library(reshape2) data1 < - melt(data, id.vars = c("x", "y")) dcast(data1, x ~ variable + y) # x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b value.2_c value.2_d #1 blue 5 6 7 8 17 18 19 20 #2 green 9 10 11 12 21 22 23 24 #3 red 1 2 3 4 13 14 15 16