Для завершения я использовал dplyr
и 'tidyr' и сделал сравнение с другими функциями.
ОБНОВЛЕНИЕ: Я сделал еще одну версию ответа @ Jimbou, не используя фильтр и выбрав функции myfun4()
.Это самое быстрое соединение в моем тесте.Ответ Ральфа теперь идет вторым.Моя первоначальная версия (myfun3()
) идет третьей.
microbenchmark::microbenchmark(myfun1(),myfun2(),myfun3(),myfun4())
Unit: milliseconds
expr min lq mean median uq max neval
myfun1() 23.1527 28.36865 31.322275 31.53225 33.69430 52.7319 100
myfun2() 5.2549 5.78445 8.241408 8.25995 9.63870 14.4018 100
myfun3() 7.9534 10.15115 11.976498 11.40415 13.66255 20.9362 100
myfun4() 2.9676 3.40105 5.032863 4.87115 5.56065 19.0217 100
Код для функций:
myfun4<-function(){
colnames(DF2)[1]='Director_2007'
DF_final<-left_join(DF,DF2[DF2$Year==2006,-2],by='Director_2007') %>%
left_join(DF2[DF2$Year==2007,-2],by='Director_2007')
n=dim(DF_final)[2]
colnames(DF_final)[(n-1):n]=paste0('YearsExperience_',2006:2007)
}
myfun3<-function(){
DF2_spread<-tidyr::spread(DF2,Year,YearsExperience)[,-2]
colnames(DF2_spread)=c('Director_2007',paste0('Experience_',colnames(df2_spread)[2:3]))
DF_final<-dplyr::left_join(DF,DF2_spread,by='Director_2007')
}
myfun2<-function() {
DF1 <- reshape(DF, direction = "long", varying = names(DF)[5:10], sep = "_", timevar = "Year")
DF3 <- merge(DF1, DF2, all.x = TRUE, by.x = c("Director" , "Year"), by.y = c("DirectorID", "Year"))
DF_final<-reshape(DF3, direction = "wide", v.names = names(DF3)[c(1,7,8,10)], timevar = "Year", sep = "_")
}
myfun1<-function(){
DF %>%
left_join(DF2 %>%
filter(Year == 2006) %>%
select(DirectorID,YearsExperience_2016=YearsExperience),
by=c("Director_2006" = "DirectorID")) %>%
left_join(DF2 %>%
filter(Year == 2007) %>%
select(DirectorID,YearsExperience_2017=YearsExperience),
by=c("Director_2007" = "DirectorID"))
}