Excellent! I was messing with this problem since the early afternoon.  
Actually the discrepancy you noticed remaining comes from negative 
difference in

diff(as.numeric(transect[,2]))

One can work it around using  abs(diff(as.numeric(transect[,2]))). This 
makes:

runno <- cumsum(c(TRUE, abs(diff(as.numeric(transect[,2])))!=0))
aggregate(transect[,1], list(obs = transect[,2], runno = runno), sum)

I did not know about this use of diff, which was the key point... and 
then cumsum for polishing. Really great and also elegant (concise). I 
like it!

Thanks a lot!!!

Cheers,

Patrick


Gabor Grothendieck a écrit :
> Create another variable that gives the run number and aggregate on
> both the habitat and run number removing the run number after
> aggregating:
>
> runno <- cumsum(c(TRUE, diff(as.numeric(transect[,2])) !=0))
> aggregate(transect[,1], list(obs = transect[,2], runno = runno), sum)[,-2]
>
> This does not give the same as your example but I think there are some
> errors in your example output.
>
> On 2/26/06, Patrick Giraudoux <[EMAIL PROTECTED]> wrote:
>   
>> Dear All,
>>
>> I would like to make partial sums (or means or any other function) of
>> the values in intervals along a sequence (spatial transect) where groups
>> are defined.
>>
>> For instance:
>>
>> habitats<-rep(c("meadow","forest","meadow","pasture"),c(10,5,12,6))
>> observations<-rpois(length(habitats),2)
>> transect<-data.frame(observations=observations,habitats=habitats)
>>
>> aggregate() is not suitable for my purpose because I want a result
>> respecting the order of the habitats encountered although they may have
>> the same name (and not pooling each group on each level of the factor
>> created). For instance, the output of the ideal function
>> mynicefunction() would be something as:
>>
>> mynicefunction(transect$observations, by=list(transect$habitats),sum)
>> meadow     16
>> forest      9
>> meadow     21
>> pasture    17
>>
>> and not
>>
>> aggregate(transect$observations,by=list(transect$habitats),sum)
>>  Group.1  x
>> 1  forest  9
>> 2  meadow 37
>> 3 pasture 17
>>
>> Did anybody hear about such a function already written in R? If no, any
>> idea to make it simple and elegant to write?
>>
>> Cheers,
>>
>> Patrick Giraudoux
>>
>> ______________________________________________
>> R-help@stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>>
>>     
>
>   

        [[alternative HTML version deleted]]

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to