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. Found myself having to use a For Loop because I could not get sapply working. Any suggestions ? 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-tp3338383p3338383.html Sent from the R help mailing list archive at Nabble.com.
On Mar 7, 2011, at 12:34 AM, rivercode wrote:> 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 > > --David Winsemius, MD West Hartford, CT
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] } 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.
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
Look at the filter() function, which can do recursive and convolutional filtering. cumsum() and diff(), respectively, are special cases of recursive and convolutional filtering and cumsum() may be enough in your case. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of rivercode > Sent: Monday, March 07, 2011 8:12 AM > To: r-help at r-project.org > Subject: Re: [R] Replace for loop when vector calling itself > > > 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] } > > 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. >