Or a slight refinement of that:

system.time(out2 <- data.table(id=seq(vec2), val=vec2, key="val")[J(vec1), list(list(id))]$V1)

Matthew

On 25/08/13 21:58, Arunkumar Srinivasan wrote:
How about this?

system.time(out <- data.table(id=seq(vec2), val=vec2, key="val")[J(vec1)][, list(list(id)), by=val]$V1)
   user  system elapsed
  0.098   0.004   0.103

Arun

On Sunday, August 25, 2013 at 10:27 PM, arun wrote:

Hi,
I tried a ?data.table() method to solve the problem in the link below.

http://r.789695.n4.nabble.com/how-to-combine-apply-and-which-or-alternative-ways-to-do-so-td4674424.html#a4674434

But, it was not that fast.

set.seed(24)
vec1<- sample(1e5,1e3,replace=FALSE)
set.seed(48)
vec2<- sample(1e3,1e6,replace=TRUE)
system.time({res1<- tapply(vec1,1:1e3,FUN=function(i) {which(vec2==i)})})?# user system elapsed
#  3.912   0.000   3.880

system.time(res2<- sapply(vec1,function(x) which(vec2%in%x)))
#   user  system elapsed
# 24.368   0.000  23.247
?vecR1<-unlist(res1)
names(vecR1)<-NULL
vecR2<- unlist(res2)
identical(vecR1,vecR2)
#[1]TRUE

library(data.table)
dt1<- data.table(vec1,Group=1:1e3,key='Group')
system.time({res3<- dt1[,list(list(which(vec1==vec2))),by=Group]})##Not that fast?
# user  system elapsed
#  3.756   0.120   3.886 ######
identical(vecR1,unlist(res3$V1))
#[1] TRUE



Is there a faster way?

Thanks.

A.K.
_______________________________________________
datatable-help mailing list
[email protected] <mailto:[email protected]>
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help



_______________________________________________
datatable-help mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help

_______________________________________________
datatable-help mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help

Reply via email to