[R] help with simple function

T.D.Rudolph prairie.picker at gmail.com
Fri May 30 01:38:29 CEST 2008


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 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-tp17498394p17548465.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list