[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