la primera Parte de la respuesta de Joris es buena, pero en el caso de valores no exclusivos en df1
, el bucle for-row no se escalará bien en grandes marcos de datos.
Se podría utilizar una "actualización de unirse a" data.table
modificar en su lugar, que será bastante rápido:
library(data.table)
setDT(df1, key = 'x1')
setDT(df2, key = 'x1')
df1[df2, x2 := i.x2]
# (thanks to @Frank for suggestion)
# Or if you didn't set keys beforehand you could do:
df1[df2, on = .(x1), x2 := i.x2]
O, suponiendo que no se preocupan por mantener el orden consecutivo, se puede usar SQL-inspirado dplyr
:
library(dplyr)
union_all(
inner_join(df1["x1"], df2), # x1 from df1 with matches in df2, x2 from df2
anti_join( df1, df2["x1"]) # rows of df1 with no match in df2
) # %>% arrange(x1) # optional, won't maintain an arbitrary row order
Cualquiera de estos escala mucho mejor que el ciclo for modo de fila.
Agradable. Escribí el partido con argumentos invertidos y no pude entender por qué fue más complicado de lo que pensé que debería ser. Añadiré mi respuesta también porque puede ayudar a otros a pensar cómo cambiar el orden de los argumentos en un partido puede hacer que las cosas sean más fáciles o más difíciles. – Aaron
Gracias Joris. Estaba trabajando con 'coincidencia' pero no pude hacerlo funcionar. – Mike
He agregado una solución que funcionará mejor en el caso de valores no exclusivos en df1. – C8H10N4O2