-1
votes

Comment puis-je fusionner deux ensembles de données, une colonne sera entre deux colonnes?

Salut, je veux fusionner deux dataframes (d1 et d2), la règle est les mêmes lignes dans les colonnes d1 et d2 et St1 et St2 de d2 seront entre St1 et St2 de dt1. la production et les entrées attendues sont ci-dessous. Merci

dt1 <- data.frame(ID=c(1,2,3,4), X=c("a","b","c","d"), St1=c(1000,900, 1500, 2500), St2=c(2000,3000, 1800, 4000))
dt2<-data.frame(ID=c(1,4,3,2), X=c("a","e","c","f"), St1=c(1200,2700, 1900, 2000), St2=c(1800,9000, 2650, 2200))

    dt_Exp<-data.frame(ID=c(1), X=c("a"), St1.x=c(1000), 
   St2.x=c(2000),St1.y=c(1200), St2.y=c(1800))


0 commentaires

3 Réponses :


0
votes

Vous pouvez fusionner les deux dataframes en utilisant inner_join , puis en utilisant la fonction by pour regrouper la fusion par des colonnes similaires.

Tel que:

dt1 <- data.frame(ID=c(1,2,3,4), X=c("a","b","c","d"), St1=c(1000,900, 1500, 2500), St2=c(2000,3000, 1800, 4000))
dt2<-data.frame(ID=c(1,4,3,2), X=c("a","e","c","f"), St1=c(1200,2700, 1600, 2000), St2=c(1800,9000, 1650, 2200))

dt_Exp<-data.frame(ID=c(1,3), X=c("a","c"), St1.x=c(1000,1500), St2.x=c(2000, 1800),St1.y=c(1200,1600), St2.y=c(1800, 1650))
dt21

dat <- inner_join(dt1, dt2, by = c("X", "ID"))


2 commentaires

Merci @Lime Je pense que vous m'avez mal compris, oui nous devons utiliser inner_joint' , mais comment ajouter la fonction between au inner_joint' , j'ai changé l'exemple, la sortie attendue est maintenant différente


Il me semble que vous venez de fusionner les deux colonnes, côte à côte, et ce qui est affiché est la première ligne lorsque les colonnes sont fusionnées côte à côte. Sauf si vous voulez dire que les colonnes de dt2 doivent être entre la première colonne de dt1 et la dernière colonne de dt1 . Si tel est le cas, alors vous pouvez juste, tout en utilisant mon code ou votre code, manipuler les colonnes dans la trame de données en utilisant dat <- dat[, 1, 3, 4, 2] , qui commande dt2 colonnes st1 et st2 entre dt1 Colonnes. Est ce que c'est ce que vous recherchiez?



0
votes
library(sqldf)

dt_Exp<-sqldf("select * from dt1 inner join dt2 on dt1.ID = dt2.ID and dt1.X=dt2.X where dt2.St1 between dt1.St1 and dt1.St2  and dt2.St2 between dt1.St1 and dt1.St2") 


1 commentaires

@ ne fonctionne pas dans les messages de questions et réponses et ne convient pas ici. Les réponses basées uniquement sur le code sont déconseillées, expliquez pourquoi elles répondent à la question. Comment demander Comment répondre Centre d'aide



0
votes

Il n'était pas clair à partir de la question de savoir si la fusion devait correspondre uniquement à l'ID ou à la fois à l'ID et à X, alors voici deux possibilités:

> merge(dt1, dt2, by=c("ID","X"))
  ID X St1.x St2.x St1.y St2.y
1  1 a  1000  2000  1200  1800
2  3 c  1500  1800  1900  2650

> merge(dt1, dt2, by=c("ID"))
  ID X.x St1.x St2.x X.y St1.y St2.y
1  1   a  1000  2000   a  1200  1800
2  2   b   900  3000   f  2000  2200
3  3   c  1500  1800   c  1900  2650
4  4   d  2500  4000   e  2700  9000

La différence réside dans les noms des arguments «par» qui peuvent être donnés comme vecteur de caractères lors de l'utilisation de la fonction de merge base R. (Pas besoin de packages ajoutés.)


0 commentaires