3 votes

Comment transformer un cadre de données en une matrice avec des valeurs de groupe en lignes et en colonnes ?

J'ai exécuté un morceau de code comme ceci

x = data.frame(numerator = 1:3, value = letters[1:3],value1=letters[4:6])
xa = aggregate(list(x$numerator),by=list(x$value,x$value1),FUN=sum)

Mais le résultat xa est formaté comme suit

 Group.1 Group.2 X1.3
1       a       d    1
2       b       e    2
3       c       f    3

J'aimerais que mes résultats soient organisés sous forme de matrice, de sorte que les lignes soient représentées par les valeurs du groupe 1 et les colonnes par les valeurs du groupe 2, comme suit :

    d e f
a   1 NULL NULL
b   NULL 2 NULL
c   NULL NULL 3

Comment je fais ça ?

3voto

Wojciech Sobala Points 2950

Vous pouvez utiliser daply du paquet plyr.

xa = daply(.data=x,
           .variables=c("value","value1"),
           .fun=function(x) sum(x$numerator))

1voto

Onyambu Points 16644

Nous pouvons utiliser une fonction BASE R :

  tapply(x$numerator,x[,2:3],I)
        value1
value  d  e  f
    a  1 NA NA
    b NA  2 NA
    c NA NA  3

0voto

shghm Points 70

Une autre option consiste à utiliser xtabs du paquetage stats :

x = data.frame(numerator = 1:3, value = letters[1:3],value1=letters[4:6])

Ensuite, vous utilisez le aggregate comme vous l'avez fait :

xa = aggregate(list(x$numerator),by=list(x$value,x$value1),FUN=sum)

Et la conversion en une belle matrice est faite via

xb<-xtabs(X1.3~Group.1+Group.2,xa)

    Group.2
Group.1 d e f
      a 1 0 0
      b 0 2 0
      c 0 0 3

Notez que contrairement aux solutions ci-dessus NULL o NA sont ici indiquées comme 0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X