Используйте tidyr::expand
, чтобы охватить все годы для комбинации CompanyID
и DirectorID
. Тогда reshape2::dcast
позволит преобразовать данные в ожидаемый формат для df2
как:
library(reshape2)
library(tidyverse)
df2 <- df %>% group_by(DirectorID, CompanyID) %>%
expand(Year = seq(min(StartYear), max(EndYear))) %>%
group_by(CompanyID, Year) %>%
mutate(rn = row_number()) %>%
dcast(rn+CompanyID~Year,fun.aggregate = NULL, value.var="DirectorID") %>%
select(-rn)
Результат:
df2
# CompanyID 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016
# 1 25830 401544433 401544433 196167673 196167673 196167673 196167673 196167673 196167673 196167673 196167673 11734844255
# 2 25830 401604433 401604433 401544433 401544433 401544433 401544433 401544433 401544433 401544433 11734844255 187836811559
# 3 25830 187836811559 187836811559 401604433 401604433 401604433 187836811559 187836811559 187836811559 187836811559 187836811559 NA
# 4 25830 NA NA 187836811559 187836811559 187836811559 NA NA NA NA NA NA
# 5 12339 NA NA NA 6613115791 6613115791 5524344997 5524344997 5524344997 5524344997 5524344997 5524344997
# 6 12339 NA NA NA NA NA 6613115791 6613115791 6613115791 5524354997 5524354997 5524354997
# 7 12339 NA NA NA NA NA NA NA NA 5742347684 6613115791 6613115791
# 8 12339 NA NA NA NA NA NA NA NA 6613115791 NA NA
Получить df5
сейчас:
#Use of mutate_at and pmatch to get Gender
df5 <- df3 %>% inner_join(df2, by="CompanyID") %>%
mutate_at(vars(starts_with("20")),
funs(Gender = df4$Gender[pmatch(., df4$DirectorID)] ))
Часть df5
для демонстрации результата
df5[,c(1:4,14:15,25:26)]
# CompanyID CompanyName CountryName ISIN 2015 2016 2015_Gender 2016_Gender
# 1 25830 BANKxxx Austria AT000504 196167673 11734844255 M M
# 2 25830 BANKxxx Austria AT000504 11734844255 187836811559 M F
# 3 25830 BANKxxx Austria AT000504 187836811559 NA F <NA>
# 4 25830 BANKxxx Austria AT000504 NA NA <NA> <NA>
# 5 12339 BANKyyy Belgium AT034003 5524344997 5524344997 F F
# 6 12339 BANKyyy Belgium AT034003 5524354997 5524354997 M M
# 7 12339 BANKyyy Belgium AT034003 6613115791 6613115791 M M
# 8 12339 BANKyyy Belgium AT034003 NA NA <NA> <NA>
Данные:
df <- read.table(text =
"DirectorID CompanyID StartYear EndYear
11734844255 25830 2015 2016
187836811559 25830 2006 2016
196167673 25830 2008 2015
401544433 25830 2006 2014
401604433 25830 2006 2010
5524344997 12339 2011 2016
5524354997 12339 2014 2016
5742347684 12339 2014 2014
6613115791 12339 2009 2016",
header = TRUE, stringsAsFactors = FALSE)
df3 <- read.table(text =
"CompanyID CompanyName CountryName ISIN
25830 BANKxxx Austria AT000504
12339 BANKyyy Belgium AT034003",
header = TRUE, stringsAsFactors = FALSE)
df4 <- read.table(text =
"DirectorID Gender
11734844255 M
187836811559 F
196167673 M
401544433 M
401604433 M
5524344997 F
5524354997 M
5742347684 M
6613115791 M",
header = TRUE, stringsAsFactors = FALSE)