[R] trying ti use a function in aggregate
Rui Barradas
ruipbarradas at sapo.pt
Thu Oct 25 17:59:20 CEST 2012
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.
More information about the R-help
mailing list