On 08-Sep-09 13:06:28, Robin Hankin wrote: > Hi > I deal with long vectors almost all of whose elements are zero. > Typically, the length will be ~5e7 with ~100 nonzero elements. > > I want to deal with these objects using a sort of sparse > vector. > > The problem is that I want to be able to 'add' two such > vectors. > > Toy problem follows. Suppose I have two such objects, 'a' and 'b': > > > a > $index > [1] 20 30 100000000 > $val > [1] 2.2 3.3 4.4 > > > b > $index > [1] 3 30 > $val > [1] 0.1 0.1 > > What I want is the "sum" of these: > > > AplusB > $index > [1] 3 20 30 100000000 > $val > [1] 0.1 2.2 3.4 4.4 > > See how the value for index=30 (being common to both) is 3.4 > (=3.3+0.1). What's the best R idiom to achieve this?
I don't know about "the best", Robin, but how about something like: indices <- sort(unique(c(a$index,b$index))) N <- length(indices) values <- NULL for(i in indices){ if(i %in% a$index){A <- a$val[a$index==i]} else A <- 0 if(i %in% b$index){B <- b$val[b$index==i]} else B <- 0 values <- c(values,A+B) } AplusB <- list(index=indices,val=values) ## Test: a<-list(index=c(20,30,100000000),val=c(2.2,3.3,4.4)) b<-list(index=c(3,30),val=c(0.1, 0.1)) indices <- sort(unique(c(a$index,b$index))) N <- length(indices) values <- NULL for(i in indices){ if(i %in% a$index){A <- a$val[a$index==i]} else A <- 0 if(i %in% b$index){B <- b$val[b$index==i]} else B <- 0 values <- c(values,A+B) } AplusB <- list(index=indices,val=values) AplusB # $index # [1] 3e+00 2e+01 3e+01 1e+08 # $val # [1] 0.1 2.2 3.4 4.4 Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 08-Sep-09 Time: 14:42:53 ------------------------------ XFMail ------------------------------ ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.