Very interesting. Thanks. Very concise! interesting use of cumsum. I'll have to see if I can work that into my real code where I need to take a conditional cumsum. I think it will work.
On my system the Final column doesn't seem quite right but that's OK. There's enough here for me to study and I like that it doesn't have a loop. Thanks! On Sat, Jul 18, 2009 at 5:10 PM, Gabor Grothendieck<ggrothendi...@gmail.com> wrote: > Here `out` is the same as the final value of `MyDF` in your code > using cumsum() instead of a loop: > > set.seed(123) > DF <- data.frame(cbind(Event= 1:10, Initial=0, > Offset=round(100*rnorm(10), 0), Final=0 )) > out <- transform(DF, Initial = 10000 + c(0, head(cumsum(DF$Offset), -1))) > out$Final <- with(DF, Initial + Offset) > > > On Sat, Jul 18, 2009 at 6:59 PM, Mark Knecht<markkne...@gmail.com> wrote: >> Hi, >> No, it's not about cumsum specifically. It's about building up the >> list as the events go by. >> >> I managed to create this code but it does depend on a for loop. >> Notice how the Final value on each row becomes the Initial value on >> the next row. Basically I want to build a data.frame with 5-10 values >> from the previous line which will help me determine what I would do on >> the current line. >> >> This morning I had nothing while this afternoon I have this code. >> I'm not sure if a real R programmer like you would approve so I'm >> looking to get better. >> >> Thanks, >> Mark >> >> >> InitialValue = 10000 >> MarginReq = 4000 >> >> MyDF = data.frame(cbind(Event= 1:10, Initial=0, >> Offset=round(100*rnorm(10), 0) , >> Final=0 )) >> >> MyDF$Initial[1] = InitialValue >> MyDF >> >> CurrentDate = 0 >> CurrentFinal = InitialValue >> MyNumRows = dim(MyDF)[1] >> MyNumRows >> >> for (n in 1:MyNumRows) { >> ## Save values from previous row >> MyDF$Initial[n] = CurrentFinal >> >> # Add Offset to current value to get new total >> >> MyDF$Final[n] = MyDF$Initial[n] + MyDF$Offset[n] >> >> ## Save values for next row >> CurrentFinal = MyDF$Final[n] >> } >> >> MyDF >> >> On Sat, Jul 18, 2009 at 3:34 PM, Gabor >> Grothendieck<ggrothendi...@gmail.com> wrote: >>> I am not entirely clear on what you want to do but >>> if you simply want a cumulative sum use cumsum: >>> >>> cumsum(rep(100, 5)) + 10000 >>> >>> or to do cumsum using Reduce and + try: >>> >>> Reduce("+", rep(100, 5), init = 10000, acc = TRUE) >>> >>> On Sat, Jul 18, 2009 at 3:59 PM, Mark Knecht<markkne...@gmail.com> wrote: >>>> Hi Gabor, >>>> Thanks for the pointer to Reduce. It looks quite interesting. I >>>> made an attempt to use it but I'm not clear how I would move the >>>> output of the Reduce execution on row 1 to become the Initial value on >>>> Row 2. In this output: >>>> >>>>> MyDF >>>> Event Initial Offset Final >>>> 1 1 10000 -31 9969 >>>> 2 2 0 10 10 >>>> 3 3 0 -133 -133 >>>> 4 4 0 -91 -91 >>>> 5 5 0 -145 -145 >>>> 6 6 0 74 74 >>>> 7 7 0 4 4 >>>> 8 8 0 19 19 >>>> 9 9 0 -120 -120 >>>> 10 10 0 47 47 >>>>> >>>> >>>> It seems that the intended use of Reduce is for when I have all the >>>> values previously set up in the array and then want to execute the >>>> same commands down through the array. That is very powerful and makes >>>> sense in most cases, but in my case I have to calculate the values on >>>> a line-by-line basis where the execution of Reduce on row 1 (the 9969) >>>> must become the Initial value on row 2 before Reduce it's work on row >>>> 2. >>>> >>>> I think I'm not fully grasping your intentions here. >>>> >>>> Code follows. >>>> >>>> Thanks, >>>> Mark >>>> >>>> >>>> >>>> >>>> InitialValue = 10000 >>>> >>>> MyDF = data.frame(cbind(Event = 1:10, Initial = 0, Offset = 0 , Final = 0)) >>>> MyDF$Offset = round(100*rnorm(10), 0) >>>> MyDF$Initial[1] = InitialCash >>>> MyDF >>>> >>>> AddPL = function(x) Reduce("+", x[2:3]) >>>> >>>> MyDF$Final = AddPL(MyDF) >>>> >>>> MyDF >>>> >>>> >>>> >>>> On Fri, Jul 17, 2009 at 9:02 PM, Gabor >>>> Grothendieck<ggrothendi...@gmail.com> wrote: >>>>> See ?Reduce >>>>> >>>>> On Fri, Jul 17, 2009 at 11:10 PM, Mark Knecht<markkne...@gmail.com> wrote: >>>>>> Hi, >>>>>> Is it possible to make something like the following code actually >>>>>> work? My goal in this example would be that I'd see results like >>>>>> >>>>>> 1 10000 10100 >>>>>> 2 10100 10200 >>>>>> 3 10200 10300 >>>>>> 4 10300 10400 >>>>>> >>>>>> In real usage the function would obviously do a lot more work, but the >>>>>> question I cannot answer myself yet is whether the apply can return a >>>>>> value from the work on one row and then use that value as the input to >>>>>> the function for the next row? >>>>>> >>>>>> Thanks, >>>>>> Mark >>>>>> >>>>>> >>>>>> ReturnLast = function (.row, NextInitial=100) { >>>>>> .row$Initial = as.numeric(NextInitial) >>>>>> .row$Final = as.numeric(.row$Initial+100) >>>>>> } >>>>>> >>>>>> MyStart = 10000 >>>>>> X = data.frame(cbind(Event = 1:10, Initial = 0, Final = 0)) >>>>>> >>>>>> X >>>>>> >>>>>> MyStart = apply(X, 1, ReturnLast( X, MyStart)) >>>>>> >>>>>> X >>>>>> >>>>>> ______________________________________________ >>>>>> 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. >>>>>> >>>>> >>>> >>> >> > ______________________________________________ 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.