Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combinatorical partial sum

I am looking in R for a function partial.sum() which takes a vector of numbers and returns an ascending sorted vector of all partial sums:

test=c(2,5,10)
partial.sum(test)

# 2 5 7 10 12 15 17
## 2 is the sum of element 2
## 5 is the sum of element 5    
## 7 is the sum of elements 2 & 5    
## 10 is the sum of element 10    
## 12 is the sum of elements 2 & 10    
## 15 is the sum of elements 5 & 10
## 17 is the sum of elements 2 & 5 & 10
like image 729
user2030503 Avatar asked Dec 19 '22 14:12

user2030503


1 Answers

Here is one using recursion. (Not making claims about it being efficient either)

partial.sum <- function(x) {
   slave <- function(x) {
      if (length(x)) {
         y <- Recall(x[-1])
         c(y + 0, y + x[1])
      } else 0
   }
   sort(unique(slave(x)[-1]))
}

partial.sum(c(2,5,10))
# [1]  2  5  7 10 12 15 17

Edit: well, turns out it is a little faster than I thought:

x <- 1:20
microbenchmark(flodel(x), dason(x), matthew(x), times = 10)
# Unit: milliseconds
#        expr        min        lq     median        uq       max neval
#   flodel(x)   86.31128   86.9966   94.12023  125.1013  163.5824    10
#    dason(x) 2407.27062 2461.2022 2633.73003 2846.2639 3031.7250    10
#  matthew(x) 3084.59227 3191.7810 3304.36064 3693.8595 3883.2767    10

(I added sort and/or unique to dason and matthew's functions where appropriate for fair comparison.)

like image 58
flodel Avatar answered Jan 10 '23 08:01

flodel