2017-01-12 3 views
1

Il y a le exmaple de mon dataframe:cellules Converting dans colnames

> df 
n b c d 
A Eeee Aaaa  
B Aaaa Bbbb Jjjj 
C Jjjj Cccc  
D Aaaa Dddd 

Je veux convertir les valeurs des cellules dans colnames uniques et remplir la trame de données avec des valeurs binaires, de sorte que le dataframe résultant ressemblerait à ceci:

> resulting_df 
n Aaaa Bbbb Cccc Eeee Jjjj 
A 1 0 0 1 0 
B 1 1 0 0 1 
C 0 0 1 0 1 
D 0 0 0 0 0 

Je suis sûr qu'il devrait y avoir un moyen facile d'accomplir cela sans boucles. S'il vous plaît, aidez.

+0

Eh bien, vous l'avez tagué 'reshape2', mais avez-vous essayé le paquet? –

+0

@RichScriven oui, je l'explore en ce moment mais je n'arrive toujours pas à comprendre quelle fonction utiliser. Je suppose que j'ai besoin de la propagation comme (0) de tidyr – Schatt95

Répondre

4

reshape2 peut faire:
données:

df=structure(list(n = structure(1:4, .Label = c("A", "B", "C", "D" 
), class = "factor"), b = structure(c(2L, 1L, 3L, 1L), .Label = c("Aaaa", 
"Eeee", "Jjjj"), class = "factor"), c = structure(1:4, .Label = c("Aaaa", 
"Bbbb", "Cccc", "Dddd"), class = "factor"), d = structure(c(NA, 
1L, NA, NA), .Label = "Jjjj", class = "factor")), .Names = c("n", 
"b", "c", "d"), class = "data.frame", row.names = c(NA, -4L)) 

library(reshape2) 
dcast(melt(df,id.vars = "n"),n ~value,fun.aggregate = length) 

Ce qui donne:

n Aaaa Bbbb Cccc Dddd Eeee Jjjj NA 
1 A 1 0 0 0 1 0 1 
2 B 1 1 0 0 0 1 0 
3 C 0 0 1 0 0 1 1 
4 D 1 0 0 1 0 0 1 

Vous pouvez ensuite décocher la dernière colonne.

L'idée est de melt() les données dans un format long et puis le remanier en fonction de vos besoins avec dcast().
fun.aggregate=length est utilisé pour que les valeurs utilisées pour remplir la trame de données correspondent au nombre d'occurrences.

+0

Merci! Ça m'a aidé :) – Schatt95