data.table:
require(data.table)
setDT(df1)[, ori := .I]
setDT(df2)[, ind_df2 := .I]
setkey(df1, X1, X2, X3)
setkey(df2, X1, X2, X3)
x <- df2[df1, ind_df2]
x[is.na(x)] <- 0
x <- x[order(df1$ori)]
df2 <- df2[order(df2$ind_df2)]
df1[, ori:=NULL]
df2[, ind_df2:=NULL]
x ( ):
x
, , @Frank:
setkeyv(setDT(df2)[,ii:=.I],setdiff(names(df2),"ii"))
x <- df2[df1]$ii
x[is.na(x)] <- 0
@nicola, @Frank 100000 df1 200 df2, nicola ( , as.numeric nicola's):
:
set.seed(17)
df1 <- data.frame(replicate(3,sample(1:100,100000,rep=TRUE)))
df2 <- data.frame(df1[sample(nrow(df1),200), ])
nicola <- function(){x<-match(do.call(paste,df1),do.call(paste,df2), nomatch=0)}
cath <- function(){
dt1 <-data.table(df1); dt1[, ori:=.I]
dt2 <- data.table(df2); dt2[, ind_df2:=.I]
setkey(dt1, X1, X2, X3)
setkey(dt2, X1, X2, X3)
x <- dt2[dt1, ind_df2]
x[is.na(x)] <- 0
x <- x[order(dt1$ori)]
x
}
Frank <- function(){dt1 <-data.table(df1);dt2 <- data.table(df2); setkey(setDT(dt2)[,ii:=.I],X1,X2,X3); x <- dt2[dt1]$ii;x[is.na(x)] <- 0}
require(microbenchmark)
microbenchmark(cath(), Frank(), nicola(), unit="relative", times=100)