Hey all, I feel like the solution to this problem should be relatively simple, but for some reason I can't find answers or come up with my own solution. Given the dataframe: (SpA and SpB not important, want to look at distribution of cooccurance for each year) Year SpA SpB Coocc 2000 0 2000 2 2000 1 2001 8 2001 2 2001 0 2001 0 2002 1 2002 2 How can I apply different functions to the Coocc of each year? (Note: Different lengths for each year, ie, length(Year==2000)!=length(Year==2001)) For example, if Year==2000, function(x) x/146; if Year=2001, function(x) x/237; etc. I've figured out the long convoluted way, but since I plan to operate numerous transformations on the different years, is there some way to solve this in just a few steps? Thanks for your answer in advance! Lanna [[alternative HTML version deleted]]
try this:> x <- read.table(textConnection("Year SpA+ 2000 0 + 2000 2 + 2000 1 + 2001 8 + 2001 2 + 2001 0 + 2001 0 + 2002 1 + 2002 2"), header=TRUE)> closeAllConnections() > # convoluted if you want a 'function' for each year > l.func <- list('2000'=function(x) x / 146,+ '2001'=function(x) x / 237, + '2002'=function(x) x/ 42)> # split the data.frame and process > result <- lapply(split(x, x$Year), function(.yr){+ # call function based on year + cbind(.yr, func=l.func[[as.character(.yr$Year[1])]](.yr$SpA)) + })> do.call(rbind, result)Year SpA func 2000.1 2000 0 0.000000000 2000.2 2000 2 0.013698630 2000.3 2000 1 0.006849315 2001.4 2001 8 0.033755274 2001.5 2001 2 0.008438819 2001.6 2001 0 0.000000000 2001.7 2001 0 0.000000000 2002.8 2002 1 0.023809524 2002.9 2002 2 0.047619048> > # a more reasonable way > l.div <- c('2000'=146, '2001'=237, '2002'=42) > x$div <- x$SpA / l.div[as.character(x$Year)] > xYear SpA div 1 2000 0 0.000000000 2 2000 2 0.013698630 3 2000 1 0.006849315 4 2001 8 0.033755274 5 2001 2 0.008438819 6 2001 0 0.000000000 7 2001 0 0.000000000 8 2002 1 0.023809524 9 2002 2 0.047619048>On Thu, Nov 5, 2009 at 1:30 PM, Lanna Jin <lannajin at gmail.com> wrote:> Hey all, > > I feel like the solution to this problem should be relatively simple, but > for some reason I can't find answers or come up with my own solution. > > Given the dataframe: > (SpA and SpB not important, want to look at distribution of cooccurance for > each year) > > Year SpA SpB Coocc > 2000 ?0 > 2000 ?2 > 2000 ?1 > 2001 ?8 > 2001 ?2 > 2001 ?0 > 2001 ?0 > 2002 ?1 > 2002 ?2 > > How can I apply different functions to the Coocc of each year? > (Note: Different lengths for each year, ie, > length(Year==2000)!=length(Year==2001)) > For example, if Year==2000, function(x) x/146; if Year=2001, function(x) > x/237; etc. > > I've figured out the long convoluted way, but since I plan to operate > numerous transformations on the different years, is there some way to solve > this in just a few steps? > > Thanks for your answer in advance! > > > Lanna > > ? ? ? ?[[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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?
On 11/06/2009 05:30 AM, Lanna Jin wrote:> Hey all, > > I feel like the solution to this problem should be relatively simple, but > for some reason I can't find answers or come up with my own solution. > > Given the dataframe: > (SpA and SpB not important, want to look at distribution of cooccurance for > each year) > > Year SpA SpB Coocc > 2000 0 > 2000 2 > 2000 1 > 2001 8 > 2001 2 > 2001 0 > 2001 0 > 2002 1 > 2002 2 > > How can I apply different functions to the Coocc of each year? > (Note: Different lengths for each year, ie, > length(Year==2000)!=length(Year==2001)) > For example, if Year==2000, function(x) x/146; if Year=2001, function(x) > x/237; etc. > > I've figured out the long convoluted way, but since I plan to operate > numerous transformations on the different years, is there some way to solve > this in just a few steps? >Hi Lanna, Perhaps if you define your different functions like this: transfun2000<-function(x) x/146 transfun2001<-function(x) x/237 and then write a function like this: mytrans<-function(x) { yearlabels<-unique(x$Year) nyears<-length(yearlabels) transcooc<-rep(NA,nyears) for(i in 1:nyears) { cooc<-somefunction(x[x$Year == yearlabels[i],]) transcooc[i]<-do.call(paste("transfun",yearlabels[i],sep=""),...) } return(transcooc) } although this is largely guesswork. Jim
hey check this g=x$year tmp=split(x,g) tmp1=lapply(tmp,func) x2=unsplit(tmp1,g) Lanna Jin wrote:> > Hey all, > > I feel like the solution to this problem should be relatively simple, but > for some reason I can't find answers or come up with my own solution. > > Given the dataframe: > (SpA and SpB not important, want to look at distribution of cooccurance > for > each year) > > Year SpA SpB Coocc > 2000 0 > 2000 2 > 2000 1 > 2001 8 > 2001 2 > 2001 0 > 2001 0 > 2002 1 > 2002 2 > > How can I apply different functions to the Coocc of each year? > (Note: Different lengths for each year, ie, > length(Year==2000)!=length(Year==2001)) > For example, if Year==2000, function(x) x/146; if Year=2001, function(x) > x/237; etc. > > I've figured out the long convoluted way, but since I plan to operate > numerous transformations on the different years, is there some way to > solve > this in just a few steps? > > Thanks for your answer in advance! > > > Lanna > > [[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://old.nabble.com/performing-operations-on-a-dataframe-tp26219957p26230455.html Sent from the R help mailing list archive at Nabble.com.