William, you are right. Thanks for clarification. Andrija
On Tue, May 3, 2011 at 9:04 PM, William Dunlap <wdun...@tibco.com> wrote: > > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > > -----Original Message----- > > From: r-help-boun...@r-project.org > > [mailto:r-help-boun...@r-project.org] On Behalf Of andrija djurovic > > Sent: Tuesday, May 03, 2011 11:28 AM > > To: Woida71 > > Cc: r-help@r-project.org > > Subject: Re: [R] Simple loop > > > > Hi. > > There is no need to do this in a for loop. > > Here is one approach: > > > > x <- read.table(textConnection("Site Prof H > > 1 1 24 > > 1 1 16 > > 1 1 67 > > 1 2 23 > > 1 2 56 > > 1 2 45 > > 2 1 67 > > 2 1 46"), header = TRUE) > > closeAllConnections() > > x > > cbind(x,newCol=unlist(tapply(x[,3],paste(x[,1],x[,2],sep=""), > > function(x) x-min(x))) > > Site Prof H newCol > > 111 1 1 24 8 > > 112 1 1 16 0 > > 113 1 1 67 51 > > 121 1 2 23 0 > > 122 1 2 56 33 > > 123 1 2 45 22 > > 211 2 1 67 21 > > 212 2 1 46 0 > > That works when Site and Prof are ordered as shown, but if > they are not sorted cbind(...,tapply) won't line up the the > new entries with the old rows properly. Try doing it on > x[8:1,] to see this. > > ave() can deal that problem: > > cbind(x, newCol2 = with(x, ave(H, Site, Prof, > FUN=function(y)y-min(y)))) > Site Prof H newCol2 > 1 1 1 24 8 > 2 1 1 16 0 > 3 1 1 67 51 > 4 1 2 23 0 > 5 1 2 56 33 > 6 1 2 45 22 > 7 2 1 67 21 > 8 2 1 46 0 > Warning message: > In min(y) : no non-missing arguments to min; returning Inf > The warning is unfortunate: ave() calls FUN even for when > there is no data for a particular group (Site=2, Prof=2 in this > case). > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > > > > > Andrija > > > > > > On Tue, May 3, 2011 at 5:44 PM, Woida71 <w.gost...@ipp.bz.it> wrote: > > > > > Hello everybody, > > > I am beginning with loops and functions and would be glad > > to have help in > > > the following question: > > > If i have a dataframe like this > > > Site Prof H > > > 1 1 24 > > > 1 1 16 > > > 1 1 67 > > > 1 2 23 > > > 1 2 56 > > > 1 2 45 > > > 2 1 67 > > > 2 1 46 > > > And I would like to create a new column that subtracts the > > minimum of H > > > from > > > H, but for S1 and P1 > > > only the minimum of the data points falling into this > > category should be > > > taken. > > > So for example the three first numbers of the new column > > write: 24-16, > > > 16-16, 67-16 > > > the following numbers refering to Site1 and Prof2 write: > > 23-23, 56-23, > > > 45-23. > > > I think with two loops one refering to the Site, the other > > to the Prof, it > > > should be possible to automatically > > > create the new column. > > > Thanks a lot for any help. > > > > > > -- > > > View this message in context: > > > http://r.789695.n4.nabble.com/Simple-loop-tp3492819p3492819.html > > > Sent from the R help mailing list archive at Nabble.com. > > > > > > ______________________________________________ > > > R-help@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. > > > > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@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. > > > [[alternative HTML version deleted]] ______________________________________________ R-help@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.