2017-05-16 1 views
2

J'ai deux tables de données avec beaucoup de colonnes. Les colonnes sont les mêmes, mais elles proviennent de différents points de temps (l'une date de 2015 et l'autre date d'aujourd'hui). La structure des tables de données est à peu près quelque chose comme ceci:Conserver les colonnes de même nom adjacentes après la fusion

library(data.table) 
dt1 <- data.table(id = c("A", "B", "C"), i = c(2,4,6), a = c(1,2,3), w = c(2,3,4), f = c(2,3,5)) 
old_dt1 <- data.table(id = c("A", "B", "C"), i = c(1,2,6), a = c(1,1,1), w = c(2,1,2), f = c(1,3,1)) 

Je voudrais les rejoindre par id, mais je veux que les colonnes avec le même nom sont placés à côté de l'autre. Mon problème est que quand je fusionner (ce qui est prévu) je reçois le résultat suivant:

> merge(dt1, old_dt1, by = "id", suffixes = c("", "-2015")) 
    id i a w f i-2015 a-2015 w-2015 f-2015 
1: A 2 1 2 2  1  1  2  1 
2: B 4 2 3 3  2  1  1  3 
3: C 6 3 4 5  6  1  2  1 

Je sais que je peux réorganiser manuellement la table de données par setcolorder mais je me demandais si je manque quelque chose de simple (malheureusement, la colonnes ne sont pas dans l'ordre alphabétique de sorte que n'est pas une option ...) ce que je voudrais faire est la suivante:

result <- merge(dt1, old_dt1, by = "id", suffixes = c("", "-2015")) 
setcolorder(result, c(1,2,6,3,7,4,8,5,9)) 

> result 
    id i i-2015 a a-2015 w w-2015 f f-2015 
1: A 2  1 1  1 2  2 2  1 
2: B 4  2 2  1 3  1 3  3 
3: C 6  6 3  1 4  2 5  1 

Répondre

2

Si les colonnes sont déjà commandés, créer dans les deux ensembles de données un matrix avec 2 lignes basées sur les noms de colonnes à l'exclusion du premier, c'est-à-dire 'id', concaténer avec 'id' et définir l'ordre des colonnes

setcolorder(result, c(names(result)[1], matrix(names(result)[-1], nrow=2, byrow=TRUE))) 
result 
# id i i-2015 a a-2015 w w-2015 f f-2015 
#1: A 2  1 1  1 2  2 2  1 
#2: B 4  2 2  1 3  1 3  3 
#3: C 6  6 3  1 4  2 5  1 
+0

Wow c'était rapide! Donc, si je comprends bien, la commande 'setcolorder' passera par les valeurs de la matrice par colonne et c'est comme ça que ça fonctionne? – User2321

+0

@ User2321 La matrice 'avec' byrow = TRUE' est la clé Si vous vérifiez la sortie 'matrix (noms (résultat) [- 1], nrow = 2, byrow = TRUE)' et ensuite le concaténer, par défaut il sera transformé en un vecteur par colonne – akrun

+1

Vraiment impressionnant, merci! – User2321