one simple way could be:

sparse.vec <- function (..., fun = sum) {
    lis <- list(...)
    values <- unlist(lapply(lis, "[[", "value"))
    inds <- factor(unlist(lapply(lis, "[[", "index")))
    out <- tapply(values, inds, FUN = fun)
    list(index = as.numeric(levels(inds)), values = out)
}

a <- list(index = c(20, 30, 100000000), value = c(2.2, 3.3, 4.4))
b <- list(index = c(3, 30), value = c(0.1, 0.1))
sparse.vec(a, b)
sparse.vec(a, b, fun = prod)
sparse.vec(a, b, fun = function(x) Reduce("-", x))


I hope it helps.

Best,
Dimitris


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?




--
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus University Medical Center

Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014

______________________________________________
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.

Reply via email to