[R] trying ti use a function in aggregate

arun smartpink111 at yahoo.com
Thu Oct 25 22:21:14 CEST 2012


Hi Rui,

I thought the OP was looking for something like this:   May be I am wrong. 
dat2<-dat1[order(dat1$Trip_id,dat1$Vessel,dat1$CommonName,dat1$Length,dat1$Count),]
dat3<-dat2
dat3$Prop<-unlist(tapply(dat3$Count,list(dat3$Trip_id,dat3$CommonName),function(x) x/sum(x)))
 head(dat3)
#  Trip_id   Vessel CommonName Length Count       Prop
#1     230 Sunlight    Alewife     17     1 0.01408451
#2     230 Sunlight    Alewife     18     1 0.01408451
#3     230 Sunlight    Alewife     20     2 0.02816901
#4     230 Sunlight    Alewife     21     4 0.05633803
#5     230 Sunlight    Alewife     22    16 0.22535211
#6     230 Sunlight    Alewife     23    22 0.30985915
A.K.




----- Original Message -----
From: Rui Barradas <ruipbarradas at sapo.pt>
To: Sally_roman <sroman at umassd.edu>
Cc: r-help at r-project.org
Sent: Thursday, October 25, 2012 11:59 AM
Subject: Re: [R] trying ti use a function in aggregate

Hello,
Try the following.
(I've changed your function a bit. And named the data.frame 'dat', not 
'data', which is an R function.)


myfun <- function (x) ifelse(sum(x) == 0, 0, x/sum(x))

aggregate(Count ~ Trip_id + Length + CommonName, data = dat, myfun)

The output shows that each and every group corresponds to a single row 
of the original df. The 1's represent 100%, myfun _is_ dividing by 
sum(Count) Trip_id/Length/CommonName group. If you want just 
Trip_id/CommonName, use

aggregate(Count ~ Trip_id + CommonName, data = dat, myfun)


Or use your instruction without 'Length' in the by list:

b <- with(dat, aggregate(x=list(Percent=Count),
by=list(Trip_id=Trip_id, Species=CommonName),
FUN = myfun))
b
   Trip_id          Species    Percent
1     230          Alewife 0.01408451
2     230 Herring,Blueback 0.11111111
3     230    Shad,American 0.09090909
4     231    Shad,American 0.14285714

As you can see, the results are the same, with different output colnames.


Hope this helps,

Rui Barradas

Em 25-10-2012 15:19, Sally_roman escreveu:
> Hi -I am using R v 2.13.0.  I am trying to use the aggregate function to
> calculate the percent at length for each Trip_id and CommonName.  Here is a
> small subset of the data.
>     Trip_id          Vessel       CommonName Length Count
> 1      230        Sunlight    Shad,American     19     1
> 2      230        Sunlight    Shad,American     20     1
> 3      230        Sunlight    Shad,American     21     1
> 4      230        Sunlight    Shad,American     23     1
> 5      230        Sunlight    Shad,American     26     1
> 6      230        Sunlight    Shad,American     27     1
> 7      230        Sunlight    Shad,American     30     2
> 8      230        Sunlight    Shad,American     33     1
> 9      230        Sunlight    Shad,American     34     1
> 10     230        Sunlight    Shad,American     37     1
> 11     230        Sunlight Herring,Blueback     20     1
> 12     230        Sunlight Herring,Blueback     21     2
> 13     230        Sunlight Herring,Blueback     22     5
> 14     230        Sunlight Herring,Blueback     26     1
> 15     230        Sunlight          Alewife     17     1
> 16     230        Sunlight          Alewife     18     1
> 17     230        Sunlight          Alewife     20     2
> 18     230        Sunlight          Alewife     21     4
> 19     230        Sunlight          Alewife     22    16
> 20     230        Sunlight          Alewife     23    22
> 21     230        Sunlight          Alewife     24    16
> 22     230        Sunlight          Alewife     25     4
> 23     230        Sunlight          Alewife     26     1
> 24     230        Sunlight          Alewife     27     2
> 25     230        Sunlight          Alewife     28     2
> 26     231 Western Venture    Shad,American     23     1
> 27     231 Western Venture    Shad,American     24     1
> 28     231 Western Venture    Shad,American     25     1
> 29     231 Western Venture    Shad,American     28     2
> 30     231 Western Venture    Shad,American     29     2
>
> My code is:
> myfun<-function (x) x/sum(x)
> b<-with(data,aggregate(x=list(Percent=Count),by=list(Trip_id=Trip_id,Length=Length,Species=CommonName),
> FUN="myfun"))
>
> My issue is that the percent is not be calculated by Trip_id and CommonName.
> The result is that each row has a percent of 1 indicating that myfun is not
> dividing by the sum of counts with a Trip_id/CommonName group.  Any help
> would be appreciated.
> Thank you
>
>
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/trying-ti-use-a-function-in-aggregate-tp4647414.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.

______________________________________________
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.





More information about the R-help mailing list