2017-08-08 1 views
0

Ceci est une tâche simple dans R, mais il semble qu'il y ait un malentendu de ma part. Toute aide est appréciée clarification:Transposer et concaténer R data.tables

J'ai la data.table R suivante d'un seul fichier texte:

dat = as.data.table(fread(...)) 

     type   proportion                                                                                
    1: type_3  0.5570502431                                                                                 
    2: type_5  0.1108589951                                                                                 
    3: type_1  0.0688816856                                                                                 
    4: type_9  0.0601296596                                                                                 
    5: type_8  0.0554294976                                                                                 
    6: type_12  0.0450567261                                                                                 
    7: type_2  0.0322528363                                                                                 
    8: type_4  0.0202593193                                                                                 
    9: type_7  0.0166936791                                                                                 
10: type_6  0.0145867099                                                                                 
11: type_10  0.0141004862                                                                                 
12: type_11  0.0040518639  

Il y a environ. 500 de ces fichiers texte, dont je peux lire chacun un R data.table et mettre dans une liste R. C'est assez simple en principe:

list_of_data.tables = list(dat1, dat2, dat3, ...) 

concat = do.call("rbind", list_of_data.tables) 

Ce n'est pas le format que je voudrais. Je voudrais prendre la colonne type comme l'en-tête de la finale data.table concaténés, type_1, type_2, type_3, etc. Ensuite, chaque ligne de la data.table concaténé finale serait la colonne porportion pour dat1, etc.

Voici le format du data.table concaténés final:

 type_1 type_2 type_3 type_4 type_5 type_6 ... 
dat1 0.557 0.110 0.068 0.0601 0.0554 0.045 ... 
dat2 0.23 0.324 0.12 0.0723 0.002 0.004 ... 
... 

Ma première pensée serait de transposer la data.table originale avec t(), mais cela ne fait pas type l'en-tête. En outre, je ne suis pas sûr comment étiqueter chaque rangée par dat1, etc.

Quelle est la bonne façon de faire une chose si simple?

+1

Side note: 'fread' explique qu'il renvoie un data.table, pas besoin de contraindre. De plus, '? Rbind' explique que vous pouvez utiliser' rbindlist' au lieu de 'do.call'. – Frank

+1

Merci pour ça, je ne le savais pas! – ShanZhengYang

Répondre

1

Pour chaque dat vous devez spread les données

library(tidyr) 
new.dat <- dat %>% 
      spread(type, proportion) 

Alors pour votre list_of_new.dat, en supposant qu'ils sont dans une liste, vous pouvez les lier avec

Reduce("full_join", list_of_new.dat) 
+0

La bibliothèque que vous utilisez est «dplyr», correct? – ShanZhengYang

+0

'tidyr' ... Je pensais à l'origine utiliser des verbes' map', mais comme je ne l'ai pas fait, vous pouvez utiliser 'tidyr' uniquement. J'ai édité ma réponse. Mais je ne suis pas sûr d'où vient le '%>%' ... peut-être 'dplyr'? – CPak

+0

Je pense que je devrais créer une nouvelle colonne pour chaque 'dat1',' dat2', etc. – ShanZhengYang