R réorganiser dataframe: quelques lignes en colonnes

Je ne sais même pas comment titrer correctement la question!

supposons que j'ai un dataframe d:

DataFrame actuel:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10))

   sample cat count
1       A   k     1
2       B   l     2
3       A   m     3
4       B   n     4
5       A   o     5
6       B   p     6
7       A   q     7
8       B   r     8
9       A   s     9
10      B   t    10

et j'essaie de réorganiser les choses de telle sorte que chaque valeur de cat devienne une colonne à part, sample reste une colonne (ou devient le nom de la ligne), et count sera les valeurs dans les nouvelles colonnes de cat, avec 0 où un échantillon n'a pas de compte pour un cat. Comme ceci:

dataframe désirée mise en page:

   sample   k   l   m   n   o   p   q   r   s   t
1       A   1   0   3   0   5   0   7   0   9   0
2       B   0   2   0   4   0   6   0   8   0  10

Quelle est la meilleure façon de procéder?

C'est ce que j'ai obtenu:

for (i in unique(d$sample)) {
    s <- d[d$sample==i,]
    st <- as.data.frame(t(s[,3]))
    colnames(st) <- s$cat
    rownames(st) <- i
} 

C.-à-d. en boucle à travers les échantillons dans la base de données originale, et en transposant pour chaque sous-ensemble d'échantillon. Donc dans ce cas j'obtiens

   k m o q s
 A 1 3 5 7 9

et

   l n p r  t
 B 2 4 6 8 10

Et c'est là que je suis coincé. J'ai essayé un tas de choses avec merge(), bind(), appliquer(),... mais je n'arrive pas à frapper sur la bonne chose. En Plus, Je ne peux pas aider mais je me demande si cette boucle ci - dessus est une étape nécessaire-quelque chose avec untack() peut-être?

inutile de dire que je suis nouveau à R... Si quelqu'un peut m'aider, ce serait très apprécié!

PS Raison pour laquelle je suis en train de ré-organiser mon dataframe est, dans l'espoir de faire le traçage des valeurs plus facile (c'est à dire que je veux vous montrer la réelle df dans une parcelle en forme de tableau).

Merci!

10
demandé sur A5C1D2H2I1M1N2O1R2T1 2013-10-13 18:01:37

2 réponses

en utilisant reshape à partir de la base de R:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide")
names(nn)[-1]<-as.character(d$cat)
nn[is.na(nn)]<-0
> nn
  sample k l m n o p q r s  t
1      A 1 0 3 0 5 0 7 0 9  0
2      B 0 2 0 4 0 6 0 8 0 10
9
répondu Metrics 2013-10-13 14:28:17

Utiliser dcast à partir de reshape2 paquet

> dcast(d, sample~cat, fill=0)
  sample k l m n o p q r s  t
1      A 1 0 3 0 5 0 7 0 9  0
2      B 0 2 0 4 0 6 0 8 0 10

xtabs à partir de la base en est une autre alternative

> xtabs(count~sample+cat, d)
      cat
sample  k  l  m  n  o  p  q  r  s  t
     A  1  0  3  0  5  0  7  0  9  0
     B  0  2  0  4  0  6  0  8  0 10

Si vous préférez la sortie de données.cadre, puis essayer:

> as.data.frame.matrix(xtabs(count~sample+cat, d))
  k l m n o p q r s  t
A 1 0 3 0 5 0 7 0 9  0
B 0 2 0 4 0 6 0 8 0 10
12
répondu Jilber Urbina 2013-10-13 14:15:18