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!
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
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