2017-10-15 7 views
1

Supposons qu'il y ait deux trames de données likes les suivantes (données de this post):conditionnelle JOIN sur deux trames de données en R

df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3))) 
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1))) 

df1 
# CustomerId Product 
#   1 Toaster 
#   2 Toaster 
#   3 Toaster 
#   4 Radio 
#   5 Radio 
#   6 Radio 

df2 
# CustomerId State 
#   2 Alabama 
#   4 Alabama 
#   6 Ohio 

La question est de savoir comment puis-je faire la requête SQL suivante dans R:

SELECT * FROM df1 JOIN df2 on df1.CustomerId <= df2.CustomerId 

Ce que je sais, c'est que je peux faire la jointure interne en utilisant merge(df1, df2, by = "CustomerId"). Mais il n'est pas satisfait la condition de la jointure.

+2

'bibliothèque (sqldf); sqldf ("SELECT * FROM df1 JOIN df2 sur df1.CustomerId <= df2.CustomerId") ' –

+0

@ G.Grothendieck Donc, cela ne peut pas être fait en utilisant la fonction' merge'? – OmG

+0

Voir ce [link] (https://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right) – L30n1d45

Répondre

0

Comme je l'ai trouvé dans les commentaires de mon cher Grothendieck, une solution simple utilise package sqldf et obtenir exactement mon résultat au format sql:

library(sqldf) 
sqldf("SELECT * FROM df1 JOIN df2 on df1.CustomerId <= df2.CustomerId") 
0

Cette façon déroutante de le faire. Mais cela fonctionne bien:

library(tidyverse) 
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3))) 
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1))) 

map2_df(
    df1$CustomerId, df1$Product, 
    .f = ~ { 
    temp <- df2 %>% filter(.x <= CustomerId) 
    tibble(CustomerId.x = .x, Product = .y, 
      CustomerId.y = temp$CustomerId, State = temp$State) 
    } 
)