Here's an added caveat, with subsequently a more detailed explanation of the output desired: The data this will apply to includes a variety of whole numbers not limited to 1 & 0, a number of which may appear consecutively and not separated by zeros!
e.g. x<-c(3,2,0,1,0,2,0,0,1,0,0,0,0,4,1) answer = c(1.098, 0.69, NA, -0.69, NA, -0.41, NA, NA, 1.098, NA, NA, NA, NA, -0.22, 0) the 1st element, 3, becomes log(3) = 1.098612 the 2nd element, 2, becomes log(2) = 0.6931472 the 3rd element, 0, becomes NA (cannot log zero). the 4rd element, 1, becomes log(1/(1(number of consecutive zeros immediately preceding it) + 1 (constant))) = log(1/2) = -0.6931472 the 5th element, 0, becomes NA the 6th element, 2, becomes log(2/(1(number of consecutive zeros immediately preceding it) + 1 (constant))) = log(2/3) = -0.4054651 7-8thth elements = NA the 9th element, 1, becomes log(1/(2(number of consecutive zeros immediately preceding it) + 1 (constant))) = log(1/3) = 1.098612 the 10-13th elements, all zeros, each become NA the 14th element, 4, becomes log(4/(4(number of consecutive zeros immediately preceding it) + 1 (constant))) = log(4/5) = -0.2231436 the 15th element, 1, becomes log(1) = 0 T.D.Rudolph wrote: > > I'm trying to build on Jim's approach to change the parameters in the > function, with new rules: > > 1. if (x[i]==0) NA > 2. if (x[i]>0) log(x[i]/(number of consecutive zeros immediately preceding > it +1)) > > x<-c(1,0,1,0,0,1,0,0,0,1,0,0,0,0,1) > # i.e. output desired = c(0, NA, -0.69, NA, NA, -1.098, NA, NA, NA, -1.38, > NA, NA, NA, NA, -1.61) > y <- rle(x) > # attempting to modify Jim's function: > result <- lapply(seq_along(y$lengths), function(.indx){ > if (y$values[.indx-1] == 0) > log(y$values[.indx]/seq(y$lengths[.indx-1]+1, by=-1, > length=y$lengths[.indx])) > else rep(log(y$values[.indx]), y$lengths[.indx]) > }) > # but I am clearly missing something! > > Does it not work because I haven't addressed what to do with the zeros and > log(0)=-Inf? > I've tried adding another "ifelse" but I still get the same result. > Can someone find the error in my ways? > Tyler > > > jholtman wrote: >> >> Does this do what you want: >> >>> x<-c(0,1,0,0,1,0,0,0,1,0,0,0,0,1) >>> y <- rle(x) >>> result <- lapply(seq_along(y$lengths), function(.indx){ >> + if (y$values[.indx] == 0) >> log(y$values[.indx+1]/seq(y$lengths[.indx]+1, by=-1, >> length=y$lengths[.indx])) >> + else rep(log(y$values[.indx]), y$lengths[.indx]) >> + }) >>> unlist(result) >> [1] -0.6931472 0.0000000 -1.0986123 -0.6931472 0.0000000 -1.3862944 >> -1.0986123 -0.6931472 0.0000000 >> [10] -1.6094379 -1.3862944 -1.0986123 -0.6931472 0.0000000 >>> >>> >> >> >> On Tue, May 27, 2008 at 8:04 PM, T.D.Rudolph <[EMAIL PROTECTED]> >> wrote: >> >>> >>> In fact x[4,2] should = log(x[5,1]/2] >>> whereas x[3,2] = log(x[5,1/3]) >>> >>> i.e. The denominator in the log function equals the number of rows >>> between >>> m==0 and m>0 (inclusive, hence the "+1") >>> >>> Hope this helps!... >>> >>> >>> Charles C. Berry wrote: >>> > >>> > On Tue, 27 May 2008, T.D.Rudolph wrote: >>> > >>> >> >>> >> >>> >> I have a matrix of frequency counts from 0-160. >>> >> x<-as.matrix(c(0,1,0,0,1,0,0,0,1,0,0,0,0,1)) >>> >> >>> >> I would like to apply a function creating a new column >>> (x[,2])containing >>> >> values equal to: >>> >> a) log(x[m,1]) if x[m,1] > 0; and >>> >> b) for all x[m,1]= 0, log(next x[m,1] > 0 / count of preceding zero >>> >> values >>> >> +1) >>> >> >>> >> for example, x[1,2] should equal log(x[2,1]/2) = log(1/2) = >>> -0.6931472 >>> >> whereas x[3,2] should equal log(x[5,1]/3) = log (1/3) = -1.098612 >>> >> >>> > >>> > If you also intend that x[4,2] == x[3,2] in your example, then this >>> seems >>> > what you want: >>> > >>> >> rle.x <- rle(x[,1]) >>> >> num <- ifelse(rle.x$values == 0, c(tail(rle.x$values,-1),NA), >>> >> rle.x$values ) >>> >> denom <- ifelse(rle.x$values == 0 , rle.x$lengths +1 , 1 ) >>> >> rep(log(num/denom),rle.x$lengths) >>> > [1] -0.6931472 0.0000000 -1.0986123 -1.0986123 0.0000000 >>> -1.3862944 >>> > -1.3862944 -1.3862944 0.0000000 -1.6094379 >>> > [11] -1.6094379 -1.6094379 -1.6094379 0.0000000 >>> >> >>> > >>> > See >>> > >>> > ?rep >>> > ?rle >>> > ?tail >>> > >>> > HTH, >>> > >>> > Chuck >>> > >>> > >>> >> I will be applying this to nrow(x)=~70,000 so I would prefer to not >>> do >>> it >>> >> by >>> >> hand! >>> >> Tyler >>> >> >>> >> >>> >> >>> >> -- >>> >> View this message in context: >>> >> >>> http://www.nabble.com/help-with-simple-function-tp17498394p17498394.html >>> >> Sent from the R help mailing list archive at Nabble.com. >>> >> >>> >> ______________________________________________ >>> >> 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<http://www.r-project.org/posting-guide.html> >>> >> and provide commented, minimal, self-contained, reproducible code. >>> >> >>> > >>> > Charles C. Berry (858) 534-2098 >>> > Dept of Family/Preventive >>> > Medicine >>> > E mailto:[EMAIL PROTECTED] UC San Diego >>> > http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego >>> 92093-0901 >>> > >>> > ______________________________________________ >>> > 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<http://www.r-project.org/posting-guide.html> >>> > and provide commented, minimal, self-contained, reproducible code. >>> > >>> > >>> >>> -- >>> View this message in context: >>> http://www.nabble.com/help-with-simple-function-tp17498394p17502735.html >>> Sent from the R help mailing list archive at Nabble.com. >>> >>> ______________________________________________ >>> 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<http://www.r-project.org/posting-guide.html> >>> and provide commented, minimal, self-contained, reproducible code. >>> >> >> >> >> -- >> Jim Holtman >> Cincinnati, OH >> +1 513 646 9390 >> >> What is the problem you are trying to solve? >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> 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. >> >> > > -- View this message in context: http://www.nabble.com/help-with-simple-function-tp17498394p17552039.html Sent from the R help mailing list archive at Nabble.com. ______________________________________________ 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.