library(tidyverse)

Diferencias entre Joins

Creamos un primer dataframe que luego vamos a unir.

INDICE  <- c( 394.5, 350.7, 346.3,
              408.4, 360.8, 349.5,
              415.6, 375.3, 353.5 )

FECHA  <-  c("Abr-21", "Abr-21", "Abr-21",
             "May-21", "May-21", "May-21", 
             "Jun-21", "Jun-21", "Jun-21")

GRUPO  <-  c("Privado_Registrado","Público","Privado_No_Registrado",
             "Privado_Registrado","Público","Privado_No_Registrado",
             "Privado_Registrado","Público","Privado_No_Registrado")

Datos <- data.frame(INDICE, FECHA, GRUPO)
Datos

Creamos un segundo data frame.

# creamos un dataframe de ponderadores con la columna GRUPO igual al dataset original
Ponderadores <- data.frame(GRUPO = c("Privado_Registrado", "Público", "Otro"), 
                           PONDERADOR = c(50.16,29.91, 10.4))
Ponderadores

La variable clave que servirá para unir ambos dataframes será GRUPO. Probemos distintos tipos de join así observamos sus diferencias.

left_join(x,y)

Devuelve todas las filas de x, y todas las columnas de x e y. Las filas en x sin coincidencia en y tendrán valores NA en las nuevas columnas. Si hay varias coincidencias entre x e y, se devuelven todas las combinaciones de las coincidencias.

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
# especificamos la variable que será utilizada para unir ambas tablas con "by"
  left_join(., Ponderadores, by = "GRUPO")
Datos_join

right_join(x,y)

Devuelve todas las filas de y, y todas las columnas de x e y. Las filas en y sin coincidencia en x tendrán valores NA en las nuevas columnas. Si hay varias coincidencias entre xey, se devuelven todas las combinaciones de las coincidencias.

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
# especificamos la variable que será utilizada para unir ambas tablas con "by"
  right_join(., Ponderadores, by = "GRUPO")
Datos_join

inner_join(x,y)

Devuelve todas las filas de x donde hay valores coincidentes en y, y todas las columnas de x e y. Si hay varias coincidencias entre xey, se devuelven todas las combinaciones de las coincidencias.

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
# especificamos la variable que será utilizada para unir ambas tablas con "by"
  inner_join(., Ponderadores, by = "GRUPO")
Datos_join

semi_join(x,y)

Devuelve todas las filas de x donde hay valores coincidentes en y, manteniendo solo las columnas de x. Un semi_join se diferencia de inner_join porque este última devuelve una fila de x por cada fila coincidente de y, mientras semi_join nunca duplicará filas de x.

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
  semi_join(., Ponderadores, by = "GRUPO")
Datos_join

full_join(x,y)

Devuelve todas las filas y todas las columnas tanto de x como de y. Donde no hay valores coincidentes, devuelve NA para el que falta.

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
  full_join(., Ponderadores, by = "GRUPO")
Datos_join

anti_join(x,y)

Eevuelve todas las filas de x donde no hay valores coincidentes en y, manteniendo solo las columnas de x

# hacemos el join con el dataframe Datos 
Datos_join <- Datos %>% 
  anti_join(., Ponderadores, by = "GRUPO")
Datos_join

Si los nombres de la variable key son distintos, debemos poner:

  • by = c(“key1” = “key2”)
LS0tDQp0aXRsZTogIk9QQ0lPTkFMOiBKb2lucyBjb24gRHBseXIiDQphdXRob3I6ICJKdWFuIEJhcnJpb2xhIHkgU29mw61hIFBlcmluaSINCmRhdGU6ICIwNCBkZSBzZXB0aWVtYnJlIGRlIDIwMjEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBkZXB0aDogMg0KLS0tDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpkaXYubWFpbi1jb250YWluZXIgew0KICBtYXgtd2lkdGg6IDE2MDBweDsNCiAgbWFyZ2luLWxlZnQ6IGF1dG87DQogIG1hcmdpbi1yaWdodDogYXV0bzsNCn0NCjwvc3R5bGU+DQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojIyBEaWZlcmVuY2lhcyBlbnRyZSBKb2lucw0KDQpDcmVhbW9zIHVuIHByaW1lciBkYXRhZnJhbWUgcXVlIGx1ZWdvIHZhbW9zIGEgdW5pci4gDQoNCmBgYHtyfQ0KSU5ESUNFICA8LSBjKCAzOTQuNSwgMzUwLjcsIDM0Ni4zLA0KICAgICAgICAgICAgICA0MDguNCwgMzYwLjgsIDM0OS41LA0KICAgICAgICAgICAgICA0MTUuNiwgMzc1LjMsIDM1My41ICkNCg0KRkVDSEEgIDwtICBjKCJBYnItMjEiLCAiQWJyLTIxIiwgIkFici0yMSIsDQogICAgICAgICAgICAgIk1heS0yMSIsICJNYXktMjEiLCAiTWF5LTIxIiwgDQogICAgICAgICAgICAgIkp1bi0yMSIsICJKdW4tMjEiLCAiSnVuLTIxIikNCg0KR1JVUE8gIDwtICBjKCJQcml2YWRvX1JlZ2lzdHJhZG8iLCJQw7pibGljbyIsIlByaXZhZG9fTm9fUmVnaXN0cmFkbyIsDQogICAgICAgICAgICAgIlByaXZhZG9fUmVnaXN0cmFkbyIsIlDDumJsaWNvIiwiUHJpdmFkb19Ob19SZWdpc3RyYWRvIiwNCiAgICAgICAgICAgICAiUHJpdmFkb19SZWdpc3RyYWRvIiwiUMO6YmxpY28iLCJQcml2YWRvX05vX1JlZ2lzdHJhZG8iKQ0KDQpEYXRvcyA8LSBkYXRhLmZyYW1lKElORElDRSwgRkVDSEEsIEdSVVBPKQ0KRGF0b3MNCmBgYA0KDQpDcmVhbW9zIHVuIHNlZ3VuZG8gZGF0YSBmcmFtZS4NCg0KYGBge3J9DQojIGNyZWFtb3MgdW4gZGF0YWZyYW1lIGRlIHBvbmRlcmFkb3JlcyBjb24gbGEgY29sdW1uYSBHUlVQTyBpZ3VhbCBhbCBkYXRhc2V0IG9yaWdpbmFsDQpQb25kZXJhZG9yZXMgPC0gZGF0YS5mcmFtZShHUlVQTyA9IGMoIlByaXZhZG9fUmVnaXN0cmFkbyIsICJQw7pibGljbyIsICJPdHJvIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9OREVSQURPUiA9IGMoNTAuMTYsMjkuOTEsIDEwLjQpKQ0KUG9uZGVyYWRvcmVzDQpgYGANCg0KTGEgdmFyaWFibGUgY2xhdmUgcXVlIHNlcnZpcsOhIHBhcmEgdW5pciBhbWJvcyBkYXRhZnJhbWVzIHNlcsOhIEdSVVBPLiBQcm9iZW1vcyBkaXN0aW50b3MgdGlwb3MgZGUgam9pbiBhc8OtIG9ic2VydmFtb3Mgc3VzIGRpZmVyZW5jaWFzLiANCg0KIyMjIGxlZnRfam9pbih4LHkpDQoNCkRldnVlbHZlICoqdG9kYXMgbGFzIGZpbGFzIGRlIHgqKiwgeSB0b2RhcyBsYXMgY29sdW1uYXMgZGUgeCBlIHkuIExhcyBmaWxhcyBlbiB4IHNpbiBjb2luY2lkZW5jaWEgZW4geSB0ZW5kcsOhbiB2YWxvcmVzIE5BIGVuIGxhcyBudWV2YXMgY29sdW1uYXMuIFNpIGhheSB2YXJpYXMgY29pbmNpZGVuY2lhcyBlbnRyZSB4IGUgeSwgc2UgZGV2dWVsdmVuIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIGRlIGxhcyBjb2luY2lkZW5jaWFzLg0KDQpgYGB7cn0NCiMgaGFjZW1vcyBlbCBqb2luIGNvbiBlbCBkYXRhZnJhbWUgRGF0b3MgDQpEYXRvc19qb2luIDwtIERhdG9zICU+JSANCiMgZXNwZWNpZmljYW1vcyBsYSB2YXJpYWJsZSBxdWUgc2Vyw6EgdXRpbGl6YWRhIHBhcmEgdW5pciBhbWJhcyB0YWJsYXMgY29uICJieSINCiAgbGVmdF9qb2luKC4sIFBvbmRlcmFkb3JlcywgYnkgPSAiR1JVUE8iKQ0KRGF0b3Nfam9pbg0KYGBgDQoNCiMjIyByaWdodF9qb2luKHgseSkNCg0KRGV2dWVsdmUgKip0b2RhcyBsYXMgZmlsYXMgZGUgeSoqLCB5IHRvZGFzIGxhcyBjb2x1bW5hcyBkZSB4IGUgeS4gTGFzIGZpbGFzIGVuIHkgc2luIGNvaW5jaWRlbmNpYSBlbiB4IHRlbmRyw6FuIHZhbG9yZXMgTkEgZW4gbGFzIG51ZXZhcyBjb2x1bW5hcy4gU2kgaGF5IHZhcmlhcyBjb2luY2lkZW5jaWFzIGVudHJlIHhleSwgc2UgZGV2dWVsdmVuIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIGRlIGxhcyBjb2luY2lkZW5jaWFzLg0KDQpgYGB7cn0NCiMgaGFjZW1vcyBlbCBqb2luIGNvbiBlbCBkYXRhZnJhbWUgRGF0b3MgDQpEYXRvc19qb2luIDwtIERhdG9zICU+JSANCiMgZXNwZWNpZmljYW1vcyBsYSB2YXJpYWJsZSBxdWUgc2Vyw6EgdXRpbGl6YWRhIHBhcmEgdW5pciBhbWJhcyB0YWJsYXMgY29uICJieSINCiAgcmlnaHRfam9pbiguLCBQb25kZXJhZG9yZXMsIGJ5ID0gIkdSVVBPIikNCkRhdG9zX2pvaW4NCmBgYA0KDQojIyMgaW5uZXJfam9pbih4LHkpDQoNCkRldnVlbHZlIHRvZGFzIGxhcyBmaWxhcyBkZSB4IGRvbmRlIGhheSB2YWxvcmVzIGNvaW5jaWRlbnRlcyBlbiB5LCB5ICoqdG9kYXMgbGFzIGNvbHVtbmFzIGRlIHggZSB5KiouIFNpIGhheSB2YXJpYXMgY29pbmNpZGVuY2lhcyBlbnRyZSB4ZXksIHNlIGRldnVlbHZlbiB0b2RhcyBsYXMgY29tYmluYWNpb25lcyBkZSBsYXMgY29pbmNpZGVuY2lhcy4NCg0KYGBge3J9DQojIGhhY2Vtb3MgZWwgam9pbiBjb24gZWwgZGF0YWZyYW1lIERhdG9zIA0KRGF0b3Nfam9pbiA8LSBEYXRvcyAlPiUgDQojIGVzcGVjaWZpY2Ftb3MgbGEgdmFyaWFibGUgcXVlIHNlcsOhIHV0aWxpemFkYSBwYXJhIHVuaXIgYW1iYXMgdGFibGFzIGNvbiAiYnkiDQogIGlubmVyX2pvaW4oLiwgUG9uZGVyYWRvcmVzLCBieSA9ICJHUlVQTyIpDQpEYXRvc19qb2luDQpgYGANCiMjIyBzZW1pX2pvaW4oeCx5KQ0KDQpEZXZ1ZWx2ZSB0b2RhcyBsYXMgZmlsYXMgZGUgeCBkb25kZSBoYXkgdmFsb3JlcyBjb2luY2lkZW50ZXMgZW4geSwgKiptYW50ZW5pZW5kbyBzb2xvIGxhcyBjb2x1bW5hcyBkZSB4KiouIFVuIHNlbWlfam9pbiBzZSBkaWZlcmVuY2lhIGRlIGlubmVyX2pvaW4gcG9ycXVlIGVzdGUgw7psdGltYSBkZXZ1ZWx2ZSB1bmEgZmlsYSBkZSB4IHBvciBjYWRhIGZpbGEgY29pbmNpZGVudGUgZGUgeSwgbWllbnRyYXMgc2VtaV9qb2luIG51bmNhIGR1cGxpY2Fyw6EgZmlsYXMgZGUgeC4NCg0KYGBge3J9DQojIGhhY2Vtb3MgZWwgam9pbiBjb24gZWwgZGF0YWZyYW1lIERhdG9zIA0KRGF0b3Nfam9pbiA8LSBEYXRvcyAlPiUgDQogIHNlbWlfam9pbiguLCBQb25kZXJhZG9yZXMsIGJ5ID0gIkdSVVBPIikNCkRhdG9zX2pvaW4NCmBgYA0KIyMjIGZ1bGxfam9pbih4LHkpIA0KDQpEZXZ1ZWx2ZSAqKnRvZGFzIGxhcyBmaWxhcyB5IHRvZGFzIGxhcyBjb2x1bW5hcyB0YW50byBkZSB4IGNvbW8gZGUgeSoqLiBEb25kZSBubyBoYXkgdmFsb3JlcyBjb2luY2lkZW50ZXMsIGRldnVlbHZlIE5BIHBhcmEgZWwgcXVlIGZhbHRhLg0KDQpgYGB7cn0NCiMgaGFjZW1vcyBlbCBqb2luIGNvbiBlbCBkYXRhZnJhbWUgRGF0b3MgDQpEYXRvc19qb2luIDwtIERhdG9zICU+JSANCiAgZnVsbF9qb2luKC4sIFBvbmRlcmFkb3JlcywgYnkgPSAiR1JVUE8iKQ0KRGF0b3Nfam9pbg0KYGBgDQoNCiMjIyBhbnRpX2pvaW4oeCx5KSANCg0KRWV2dWVsdmUgKip0b2RhcyBsYXMgZmlsYXMgZGUgeCBkb25kZSBubyBoYXkgdmFsb3JlcyBjb2luY2lkZW50ZXMgZW4geSoqLCBtYW50ZW5pZW5kbyBzb2xvIGxhcyBjb2x1bW5hcyBkZSB4DQoNCmBgYHtyfQ0KIyBoYWNlbW9zIGVsIGpvaW4gY29uIGVsIGRhdGFmcmFtZSBEYXRvcyANCkRhdG9zX2pvaW4gPC0gRGF0b3MgJT4lIA0KICBhbnRpX2pvaW4oLiwgUG9uZGVyYWRvcmVzLCBieSA9ICJHUlVQTyIpDQpEYXRvc19qb2luDQpgYGANCg0KU2kgbG9zIG5vbWJyZXMgZGUgbGEgdmFyaWFibGUga2V5IHNvbiBkaXN0aW50b3MsIGRlYmVtb3MgcG9uZXI6DQoNCiogYnkgPSBjKCJrZXkxIiA9ICJrZXkyIikNCg0KDQoNCg==