2017-06-30 1 views
0

J'ai deux jeux de données, et les deux ont les mêmes dimensions, et je veux les combiner de telle sorte que la première colonne du second jeu de données soit empilée à côté de la première colonne du premier jeu de données.R Programmation - Combinaison de données Colonne

Considérons l'exemple ci-dessous, qui est la sortie attendue. Ici, v1 provient de l'ensemble de données 1, et v2 provient de l'ensemble de données 2. Je souhaite également conserver l'en-tête de colonne tel qu'il est.

        | v1 | v2 | 
           |:------:|:------:| 
           | -0.71 | -0.71 | 
           | -0.71 | -0.71 | 
           | -0.71 | -0.71 | 
           | -0.71 | -0.71 | 
           | -0.71 | -0.71 | 
           | -0.71 | -0.71 | 

J'ai essayé cbind() et data.frame(), mais les deux conduit à des secondes données ajoutées après la première série complète de données, et non la colonne après colonne.

-> dim(firstDataSet) 
    100 200 
-> dim(secondDataSet) 
    100 200 
-> finalDataSet_cbind <- cbind(firstDataSet, secondDataSet) 
-> dim(finalDataSet_cbind) 
    100 400 
-> finalDataSet_dframe <- data.frame(firstDataSet, secondDataSet) 
-> dim(finalDataSet_dframe) 
    100 400 

S'il vous plaît suggérer des moyens corrects et mieux pour y parvenir, merci.


MISE À JOUR: Réponse à duplicate flag to this question possible:

Cette réponse n'a pas fonctionné pour moi. Les données que je reçois après avoir suivi la solution, n'ont pas donné ce que je voulais, et étaient similaires à la sortie finale que j'ai obtenue avec l'approche cbind() expliquée ci-dessus.

Le first answer given fonctionne pour moi, mais avec un petit numéro de nom de colonne attribué à chaque colonne, au lieu de conserver les en-têtes de colonne d'origine.

En outre, je n'ai pas assez de réputation pour ajouter un commentaire à la réponse acceptée.

+2

double possible de [Fusion & Interleave dataframes en r] (https://stackoverflow.com/questions/24576548/merge-interleave-dataframes-in-r) –

Répondre

1

Pour fixer l'exigence de nom de colonne, vous pouvez le faire. Fondamentalement, vous d'abord cbind, puis vous créez un index dans le bon ordre. En utilisant cet index, vous créez également un vecteur de noms de colonnes corrects. Vous indexez ensuite l'ordre des colonnes et ajoutez les noms des colonnes.

df1 <- df2 <- data.frame(v1=1:10,v2=11:20, v3=21:30) 
final <- cbind(df1,df2) 

indexed <- rep(1:ncol(df1), each = 2) + (0:1) * ncol(df1) 
new_colnames <- colnames(final)[indexed] 
final_ordered <- final[indexed] 
colnames(final_ordered) <- new_colnames 

    v1 v1 v2 v2 v3 v3 
1 1 1 11 11 21 21 
2 2 2 12 12 22 22 
3 3 3 13 13 23 23 
4 4 4 14 14 24 24 
5 5 5 15 15 25 25 
6 6 6 16 16 26 26 
7 7 7 17 17 27 27 
8 8 8 18 18 28 28 
9 9 9 19 19 29 29 
10 10 10 20 20 30 30 
2

Probablement pas la solution la plus efficace avec for loop, mais fonctionne

data1 <- cbind(1:10,11:20, 21:30) 
data2 <- cbind(1:10,11:20, 21:30) 

combined <- NULL 
for(i in 1:ncol(data1)){ 
    combined <- cbind(combined, data1[,i], data2[,i]) 
} 
+0

Merci. Cela fonctionne, j'ai juste besoin de comprendre comment faire en sorte que l'en-tête de colonne ne soit pas modifié. Avec votre approche, les noms de colonne sont réaffectés en tant que v1, v2 ... vn, mais les données sont empilées comme je le souhaitais. –

+0

Oui, mais je veux également garder le nom de la colonne comme les données d'origine, je l'ai demandé en question ci-dessus. Je vais le marquer après que je l'ai compris. Si vous avez des suggestions, n'hésitez pas à partager. –

+0

La question n'a jamais été changée, @Aneconomist. La version éditée que vous voyez était d'ajouter la réponse pour l'indicateur de double. L'histoire est là, allez-y et jetez un oeil. De plus, j'essayais d'augmenter votre réponse (comme celle de PLapointe est exacte, et la vôtre est correcte aussi, mais elle rate une chose), mais je n'ai pas assez de réputation pour le faire. Lien vers l'historique: https://stackoverflow.com/posts/44850840/revisions –