[R] help with simple function

T.D.Rudolph prairie.picker at gmail.com
Fri May 30 07:50:07 CEST 2008


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 
the 7th and 8th elements, both zeros, become 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 <prairie.picker at gmail.com>
>> 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 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<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:cberry at tajo.ucsd.edu             UC San Diego
>>> > http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego
>>> 92093-0901
>>> >
>>> > ______________________________________________
>>> > 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<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 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<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 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.
>> 
>> 
> 
> 



-- 
View this message in context: http://www.nabble.com/help-with-simple-function-tp17498394p17552056.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list