I have two data.tables. I want to merge the row of second data.table dfB with the first dfA, if the year from dfA corresponds to a year one year before in dfB.
As an example, the first row of dfB would merge with the first row of dfA because the year of dfB, 2009, is one year before the year of dfA, 2010.
library(data.table)
dfA <- fread("
A B C D E F G Z iso year matchcode
1 0 1 1 1 0 1 0 NLD 2010 NLD2010
2 1 0 0 0 1 0 1 NLD 2014 NLD2014
3 0 0 0 1 1 0 0 AUS 2010 AUS2010
4 1 0 1 0 0 1 0 AUS 2006 AUS2006
5 0 1 0 1 0 1 1 USA 2008 USA2008
6 0 0 1 0 0 0 1 USA 2010 USA2010
7 0 1 0 1 0 0 0 USA 2012 USA2012
8 1 0 1 0 0 1 0 BLG 2008 BLG2008
9 0 1 0 1 1 0 1 BEL 2008 BEL2008
10 1 0 1 0 0 1 0 BEL 2010 BEL2010
11 0 1 1 1 0 1 0 NLD 2010 NLD2010
12 1 0 0 0 1 0 1 NLD 2014 NLD2014
13 0 0 0 1 1 0 0 AUS 2010 AUS2010
14 1 0 1 0 0 1 0 AUS 2006 AUS2006
15 0 1 0 1 0 1 1 USA 2008 USA2008
16 0 0 1 0 0 0 1 USA 2010 USA2010
17 0 1 0 1 0 0 0 USA 2012 USA2012
18 1 0 1 0 0 1 0 BLG 2008 BLG2008
19 0 1 0 1 1 0 1 BEL 2008 BEL2008
20 1 0 1 0 0 1 0 BEL 2010 BEL2010",
header = TRUE)
dfB <- fread("
A B C D H I J K iso year matchcode
1 0 1 1 1 0 1 0 NLD 2009 NLD2009
2 1 0 0 0 1 0 1 NLD 2014 NLD2014
3 0 0 0 1 1 0 0 AUS 2011 AUS2011
4 1 0 1 0 0 1 0 AUS 2007 AUS2007
5 0 1 0 1 0 1 1 USA 2007 USA2007
6 0 0 1 0 0 0 1 USA 2010 USA2010
7 0 1 0 1 0 0 0 USA 2013 USA2013
8 1 0 1 0 0 1 0 BLG 2007 BLG2007
9 0 1 0 1 1 0 1 BEL 2009 BEL2009
10 1 0 1 0 0 1 0 BEL 2012 BEL2012",
header = TRUE)
I thought of trying:
dfA <- merge(dfA , dfB, on =.(iso, year == year-1), all.x = TRUE, allow.cartesian=FALSE)
But that creates a match on the year, which is not what I want.
I believe also roll would try to find the closest match.
How should I write this merge?
DESIRED OUTPUT:
library(data.table)
dfA <- fread("
A B C D E F G Z H I J K year_from_B iso year matchcode
1 0 1 1 1 0 1 0 1 0 1 0 2009 NLD 2010 NLD2010
2 1 0 0 0 1 0 1 NA NA NA NA NA NLD 2014 NLD2014
3 0 0 0 1 1 0 0 NA NA NA NA NA AUS 2010 AUS2010
4 1 0 1 0 0 1 0 NA NA NA NA NA AUS 2006 AUS2006
5 0 1 0 1 0 1 1 NA NA NA NA NA USA 2008 USA2008
6 0 0 1 0 0 0 1 NA NA NA NA NA USA 2010 USA2010
7 0 1 0 1 0 0 0 NA NA NA NA NA USA 2012 USA2012
8 1 0 1 0 0 1 0 0 0 1 0 2007 BLG 2008 BLG2008
9 0 1 0 1 1 0 1 NA NA NA NA NA BEL 2008 BEL2008
10 1 0 1 0 0 1 0 1 1 0 1 2009 BEL 2010 BEL2010
11 0 1 1 1 0 1 0 1 0 1 0 2009 NLD 2010 NLD2010
12 1 0 0 0 1 0 1 NA NA NA NA NA NLD 2014 NLD2014
13 0 0 0 1 1 0 0 NA NA NA NA NA AUS 2010 AUS2010
14 1 0 1 0 0 1 0 NA NA NA NA NA AUS 2006 AUS2006
15 0 1 0 1 0 1 1 NA NA NA NA NA USA 2008 USA2008
16 0 0 1 0 0 0 1 NA NA NA NA NA USA 2010 USA2010
17 0 1 0 1 0 0 0 NA NA NA NA NA USA 2012 USA2012
18 1 0 1 0 0 1 0 0 0 1 0 2007 BLG 2008 BLG2008
19 0 1 0 1 1 0 1 NA NA NA NA NA BEL 2008 BEL2008
20 1 0 1 0 0 1 0 1 1 0 1 2009 BEL 2010 BEL2010",
header = TRUE)