[R] code for "permutative" operation

David Winsemius dwinsemius at comcast.net
Mon Mar 14 21:32:01 CET 2011


On Mar 14, 2011, at 4:16 PM, Sascha Vieweg wrote:

> On 11-03-14 21:09, David Winsemius wrote:
>
>> On Mar 14, 2011, at 3:52 PM, Sascha Vieweg wrote:
>>
>>> Hello, I need some form of a "permutative" operation on a numeric  
>>> vector x
>>> x = (v1, v2, v3, ..., vN)
>>> that produces
>>> x.r = (v1, v1+2, v1+v2+v3, ... v1+v2+...+vN)
>>> If the operation is sum() I can run
>>> x <- 5:8
>>> m <- matrix(rep(x, length(x)), ncol=length(x))
>>> (x.r <- rowsum(m * upper.tri(m, diag=TRUE), rep(1, length(x))))
>>> But there's two things I don't know and kindly request help or  
>>> comments upon:
>>> (1) What is the fastest code to perfom the forestanding operation?
>>> (2) Is there a more general function for tasks like this, not only  
>>> with the sum procedure applied to the vector? Specifically, the  
>>> zeros in the matrix may cause problems with other operations than  
>>> sum.
>>
>> Perhaps this:
>>
>>> fplus <- function(x, y) paste(x,y, sep="+")
>>> Reduce(fplus, vv, accumulate=TRUE)
>> [1] "v1"                             "v1+v2"
>> [3] "v1+v2+v3"                       "v1+v2+v3+v4"
>> [5] "v1+v2+v3+v4+v5"                 "v1+v2+v3+v4+v5+v6"
>> [7] "v1+v2+v3+v4+v5+v6+v7"           "v1+v2+v3+v4+v5+v6+v7+v8"
>> [9] "v1+v2+v3+v4+v5+v6+v7+v8+v9"     "v1+v2+v3+v4+v5+v6+v7+v8+v9+v10"
>
> Thanks, David, after trying around I found that one:
>
> x <- 5:8
> sapply(1:length(x), function(y) sum(x[1:y]))
>
> I keep your code in my records for operations that cannot be applied  
> with function names.

I guess I misunderstood your request. Try the somewhat more elegant:

 > Reduce("+", x, accum=TRUE)
[1]  5 11 18 26

>
> -- 
> Sascha Vieweg, saschaview at gmail.com

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list