Re: [R] Replace for loop when vector calling itself

From: David Winsemius <dwinsemius_at_comcast.net>
Date: Mon, 07 Mar 2011 11:52:26 -0500

On Mar 7, 2011, at 11:12 AM, rivercode wrote:

>
> Hope this clarifies my Q.
>
> Creating a vector where each element is (except the first which is
> 0) is:
> the previous element + a calculation from another vector theoP[i] -
> theoP[i-1]
>
> I could not figure out how to do this without a for loop, as the
> vector had
> to reference itself for the next element...I am missing something
> obvious,
> but not too sure what.
>
> d = vector(mode = "numeric", length= len)
> d[1] = 0
> if (len>1) for (i in 2:len) { d[i] = d[i-1] + theoP[i] - theoP[i-1] }

so why not:

c(0, cumsum(diff(theoP)) )

 > theoP <- sample(1:10, 15, replace=TRUE); len=length(theoP); d = vector(mode = "numeric", length= len)

 > d[1] = 0
 > if (len>1) for (i in 2:len) { d[i] = d[i-1] + theoP[i] - theoP[i-1] }
 >
 > d

  [1] 0 1 -6 -5 -4 0 1 0 1 -4 3 -5 -5 1 -3  > c(0, cumsum(diff(theoP)) )
  [1] 0 1 -6 -5 -4 0 1 0 1 -4 3 -5 -5 1 -3  > all.equal(d, c(0, cumsum(diff(theoP)) ) ) [1] TRUE
-- 
David.

>
> Thanks,
> Chris
>
>> Hi,
>>
>> I am missing something obvious.
>>
>> Need to create vector as:
>>
>> (0, i-1 + TheoP(i) - TheoP(i-1), repeat....) Where i is the index
>> position
>> in the vector and i[1] is always 0.
>
> I think your prototype is not agreeing with the code below. Is "i"
> suppose to be the index (as suggested above) or the prior term (as
> implied below)?
>>
>> Found myself having to use a For Loop because I could not get sapply
>> working. Any suggestions ?
>
> Assuming the code below, you construct the first three or four values
> by hand I think you will find that the intermediate values of TheoP
> will have alternating signs.
>
> term2 = 2-1 + TheoP(2) - TheoP(1)
> term3 = 3-1 + TheoP(3) - (2-1 + TheoP(2) - TheoP(1))
> term4 = 4-1 + TheoP(4) - (3-1 + TheoP(3) - (2-1 + TheoP(2) -
> TheoP(1)) )
>
> The answer to the first question will determine how you proceed. If
> the index is being used then there are two series of cumulative sums
> and perhaps you can construct an expression that can be fed to the
> cumsum function.
>
> The diff function is also available and if the index version is
> correct, then it might even be as simple as c(0,
> ((1:len)-1)+diff(TheoP) )
>
> So clarify what is intended.
> --
> David.
>
>>
>> delta <- function(x) {
>>
>> start = index[x]
>> end = index[x+1] - 1
>> iTheo = start:end
>> len = length(iTheo)
>> theoP = as.numeric(TheoBA$Bid[iTheo])
>> d = vector(mode = "numeric", length= len)
>> d[1] = 0
>> if (len>1) for (i in 2:len) { d[i] = d[i-1] + theoP[i] - theoP[i-1] }
>> return(d)
>> }
>>
>> Thanks,
>> Chris
>>
>> --
>
>
>
> --
> View this message in context:
http://r.789695.n4.nabble.com/Replace-for-loop-when-vector-calling-itself-tp3338383p3339351.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help_at_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.
David Winsemius, MD West Hartford, CT ______________________________________________ R-help_at_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.
Received on Mon 07 Mar 2011 - 16:54:22 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 07 Mar 2011 - 17:40:20 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive