Tengo los datos en la siguiente estructura:

x <- read.table(header=T, text="
X Y D S
a e 1 10
a e 2 20
a f 1 50
b c 1 40
b c 2 30
b c 3 60
b d 1 10 
b d 2 20")

Y quiero obtener el siguiente resultado:

X Y   1   2   3
a e  10  20
a f  50
b c  40  30  60
b d  10  20

Para cada combinación de columnas X y Y me gustaría transponer los datos en la columna S por orden en la columna D.

Pensé xtabs() funcionará, pero yo no lo creo, mi mejor versión es:

xtabs(formula=S~Y+D,data=x)

Con el resultado:

   D
Y    1  2  3
  c 40 30 60
  d 10 20  0
  e 10 20  0
  f 50  0  0
InformationsquelleAutor Tomas Greif | 2013-06-29

3 Comentarios

  1. 11
    require(reshape2)
    dcast(x, X + Y ~ D, value.var="S")

    Si quieres llenar vacíos entradas con 0 en lugar de NA (que es el predeterminado), entonces,

    dcast(x, X + Y ~ D, value.var="S", fill=0)
  2. 7

    Una solución en base R:

    > reshape(x, timevar="D", idvar=c("X","Y"), direction="wide")
      X Y S.1 S.2 S.3
    1 a e  10  20  NA
    3 a f  50  NA  NA
    4 b c  40  30  60
    7 b d  10  20  NA
  3. 3

    Las otras dos respuestas son muy buenas, pero para lo que vale, ya que usted menciona que comenzaron sus intentos con xtabs, usted puede acercarse a lo que estaba buscando, con una combinación de xtabs y ftable. Sin embargo, el resultado incluirá todos los niveles de factor de

    ftable(xtabs(S ~ ., x))
    #     D  1  2  3
    # X Y           
    # a c    0  0  0
    #   d    0  0  0
    #   e   10 20  0
    #   f   50  0  0
    # b c   40 30 60
    #   d   10 20  0
    #   e    0  0  0
    #   f    0  0  0

    Alternativamente, usted puede hacer algo como esto:

    data.frame(unique(x[1:2]), 
               as.data.frame.matrix(xtabs(S ~ do.call(paste, x[1:2]) + D, x)))
    #   X Y X1 X2 X3
    # 1 a e 10 20  0
    # 3 a f 50  0  0
    # 4 b c 40 30 60
    # 7 b d 10 20  0

Dejar respuesta

Please enter your comment!
Please enter your name here