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))
3 Réponses :
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"))
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?
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")
@ 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
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.)