pierwszy część odpowiedzi Jorisa jest dobra, ale w przypadku nieunikalnych wartości w df1
, pętla for-forse nie będzie dobrze skalowana large data.frames.
Można użyć aktualizacji „join” data.table
zmodyfikować w miejscu, które będzie dość szybko:
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]
Albo, zakładając, że nie dbają o utrzymanie porządku wierszy, można użyć SQL inspirowane 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
Każda z nich będzie skala znacznie lepiej niż row-mądry dla pętli.
Nice. Napisałem mecz z odwróconymi argumentami i nie mogłem się domyślić, dlaczego było to bardziej skomplikowane, niż myślałem. Dodam również moją odpowiedź, ponieważ może pomóc innym zastanowić się, w jaki sposób zmiana kolejności argumentów w meczu może ułatwić lub utrudnić proces. – Aaron
Dzięki Joris. Pracowałem z "dopasowaniem", ale nie mogłem go uruchomić. – Mike
Dodałem rozwiązanie, które będzie działać lepiej w przypadku nieunikalnych wartości w df1. – C8H10N4O2