Hi all, newbie question: I am trying to set up a very simple loop without succeeding. Let's say I have monthly observation of two variables for a year - Sales_2012_01, Sales_2012_02, Sales_2012_03, .... (total sales for jan 2012,feb 2012, etc.) - Customers_2012_01, Customers_2012_02, .... (total number of customers for jan 2012, etc.) and I want to create new monthly variables in order to compute revenues per customers: Av_revenue_2012_01 = Sales_2012_01 / Customers_2012_01 Av_revenue_2012_02 = Sales_2012_02 / Customers_2012_02 ... how can I proceed? In other programming language I used just to write something like for (i in list("01","02, ..., "12") { Av_revenue_2012_'i' = Sales_2012_'i' / Customers_2012_'i' } but in R it seems not to work like that. Further, and correct me if I am wrong, I cannot use simple (i in 1:12) since I have a 0 digit in front of the single-digit months. thanks in advance for your help
Hi> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of Paolo Donatelli > Sent: Wednesday, January 09, 2013 5:03 PM > To: r-help at r-project.org > Subject: [R] Basic loop programming > > Hi all, > > newbie question: I am trying to set up a very simple loop without > succeeding. > > Let's say I have monthly observation of two variables for a year > - Sales_2012_01, Sales_2012_02, Sales_2012_03, .... (total sales > for jan 2012,feb 2012, etc.) > - Customers_2012_01, Customers_2012_02, .... (total number of > customers for jan 2012, etc.) > > and I want to create new monthly variables in order to compute revenues > per customers: > > Av_revenue_2012_01 = Sales_2012_01 / Customers_2012_01 > Av_revenue_2012_02 = Sales_2012_02 / Customers_2012_02 ... > > how can I proceed? > > > In other programming language I used just to write something like for > (i in list("01","02, ..., "12") { Av_revenue_2012_'i' = Sales_2012_'i' > / Customers_2012_'i' > } > > but in R it seems not to work like that. Further, and correct me if I > am wrong, I cannot use simple (i in 1:12) since I have a 0 digit in > front of the single-digit months.Hm. Why do you want to do it in R if you prefer other languages? Did you find R by accident or are you prepared to use it in future? If you want to use it, it is just right time to learn some basics. Anyway, if you have 2 vectors, call them sales and customers, you can just do av.revenue <- sales/customers Until you do not provide more info about your data e.g. by at least some of ?head, ?str or preferably ?dput you hardly get some suitable advice. Regards Petr> > thanks in advance for your help > > ______________________________________________ > 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.
Hi Paolo, You say you have monthly observations of two variables, say Sales and Customers. Then, what you should have is something like this: Year Month Sales Customer 2012 Jan ss_12.1 cc_12.1 2012 Feb ss_12.2 cc_12.2 ... ... ... ... 2013 Jan ss_13.1 cc_13.1 2013 Feb ss_13.2 cc_13.2 ... ... ... ... where ss_YY.M and cc_ YY.M are numerical values (the total sales and number of customers for year YY and month M, respectively). For example, Year Month Sales Customer 2012 Jan 100 25 2012 Feb 120 30 ... ... ... ... If this is the case, and you have the data in a data frame (say df), all you need to do to create a new column in your data frame with the average revenue is:> df$Av_revenue <- df$Sales/ df$CustomerYou can omit df$ from the instruction above if you want to create the object Av_revenue but not include it in the data frame. I am not getting it right, would you please send us the first three or four lines of your data? Regards, Jos? -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Paolo Donatelli Sent: 09 January 2013 16:03 To: r-help at r-project.org Subject: [R] Basic loop programming Hi all, newbie question: I am trying to set up a very simple loop without succeeding. Let's say I have monthly observation of two variables for a year - Sales_2012_01, Sales_2012_02, Sales_2012_03, .... (total sales for jan 2012,feb 2012, etc.) - Customers_2012_01, Customers_2012_02, .... (total number of customers for jan 2012, etc.) and I want to create new monthly variables in order to compute revenues per customers: Av_revenue_2012_01 = Sales_2012_01 / Customers_2012_01 Av_revenue_2012_02 = Sales_2012_02 / Customers_2012_02 ... how can I proceed? In other programming language I used just to write something like for (i in list("01","02, ..., "12") { Av_revenue_2012_'i' = Sales_2012_'i' / Customers_2012_'i' } but in R it seems not to work like that. Further, and correct me if I am wrong, I cannot use simple (i in 1:12) since I have a 0 digit in front of the single-digit months. thanks in advance for your help ______________________________________________ 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. Wrap Up and Run 10k is back! Also, new for 2013 ? 2km intergenerational walks at selected venues. So recruit a buddy, dust off the trainers and beat the winter blues by signing up now: http://www.ageuk.org.uk/10k Milton Keynes | Oxford | Sheffield | Crystal Palace | Exeter | Harewood House, Leeds | Tatton Park, Cheshire | Southampton | Coventry Age UK Improving later life http://www.ageuk.org.uk ------------------------------- Age UK is a registered charity and company limited by guarantee, (registered charity number 1128267, registered company number 6825798). Registered office: Tavis House, 1-6 Tavistock Square, London WC1H 9NA. For the purposes of promoting Age UK Insurance, Age UK is an Appointed Representative of Age UK Enterprises Limited, Age UK is an Introducer Appointed Representative of JLT Benefit Solutions Limited and Simplyhealth Access for the purposes of introducing potential annuity and health cash plans customers respectively. Age UK Enterprises Limited, JLT Benefit Solutions Limited and Simplyhealth Access are all authorised and regulated by the Financial Services Authority. ------------------------------ This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed. If you receive a message in error, please advise the sender and delete immediately. Except where this email is sent in the usual course of our business, any opinions expressed in this email are those of the author and do not necessarily reflect the opinions of Age UK or its subsidiaries and associated companies. Age UK monitors all e-mail transmissions passing through its network and may block or modify mails which are deemed to be unsuitable. Age Concern England (charity number 261794) and Help the Aged (charity number 272786) and their trading and other associated companies merged on 1st April 2009. Together they have formed the Age UK Group, dedicated to improving the lives of people in later life. The three national Age Concerns in Scotland, Northern Ireland and Wales have also merged with Help the Aged in these nations to form three registered charities: Age Scotland, Age NI, Age Cymru.
HI, If you have more than one observation per month, you could do this: dat1<-read.table(text=" Year Month??? Sales??? Customer 2011??? Jan??? 150???? 35 2011??? Jan??? 125???? 40 2011??? Feb??? 130???? 45 2011??? Feb??? 135???? 25 2012??? Jan??? 100???? 25 2012??? Jan??? 150???? 35 2012??? Feb??? 118???? 45 2012??? Feb??? 120???? 30 2012??? Mar??? 130???? 43 2012??? Mar??? 125???? 35 ",sep="",header=TRUE,stringsAsFactors=FALSE) res<-aggregate(.~Year+Month,data=dat1,mean) ?within(res,{Avrev<-Sales/Customer}) #? Year Month Sales Customer??? Avrev #1 2011?? Feb 132.5???? 35.0 3.785714 #2 2012?? Feb 119.0???? 37.5 3.173333 #3 2011?? Jan 137.5???? 37.5 3.666667 #4 2012?? Jan 125.0???? 30.0 4.166667 #5 2012?? Mar 127.5???? 39.0 3.269231 A.K. ----- Original Message ----- From: Paolo Donatelli <donatellipaolo at gmail.com> To: r-help at r-project.org Cc: Sent: Wednesday, January 9, 2013 11:02 AM Subject: [R] Basic loop programming Hi all, newbie question: I am trying to set up a very simple loop without succeeding. Let's say I have monthly observation of two variables for a year - Sales_2012_01, Sales_2012_02, Sales_2012_03, ....? ? ? (total sales for jan 2012,feb 2012, etc.) - Customers_2012_01, Customers_2012_02, ....? (total number of customers for jan 2012, etc.) and I want to create new monthly variables in order to compute revenues per customers: Av_revenue_2012_01 = Sales_2012_01 / Customers_2012_01 Av_revenue_2012_02 = Sales_2012_02 / Customers_2012_02 ... how can I proceed? In other programming language I used just to write something like for (i in list("01","02, ..., "12") { Av_revenue_2012_'i' = Sales_2012_'i' / Customers_2012_'i' } but in R it seems not to work like that. Further, and correct me if I am wrong, I cannot use simple (i in 1:12) since I have a 0 digit in front of the single-digit months. thanks in advance for your help ______________________________________________ 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.
Yes, R is a different language, and has different syntax and different built-in functions, so, yes it works differently. If you want to do it the same way in R as in that other language, you have to use a different method for constructing the variable names inside the loop. Here's an example, using the get() and assign() functions to construct the variable names, essentially replacing your constructions like Customers_2012_'i'. I have four variables, named s01, s02 c01, c02 (sales and customers for two months) Something like this should do it: for (i in c('01','02')) { assign( paste0('r',i) , get(paste0('s',i))/get(paste0('c',i)) ) } I should now have new variables r01 and r02. This is not tested, so hopefully I got all the parentheses matched. Of course, that looks cumbersome and ugly, and it is. There are other ways in R to store your data, for which the code will be much friendlier. If you use i in 1:12 you are creating numbers, but your variable names use character strings, '01','02', etc. So, no, you can't use i in 1:12 directly. But you can use i in 1:12 if you use a formatting function on i to convert it to a character string with leading zeros. The formatC function is one such function; there are others. -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 1/9/13 8:02 AM, "Paolo Donatelli" <donatellipaolo at gmail.com> wrote:>Hi all, > >newbie question: I am trying to set up a very simple loop without >succeeding. > >Let's say I have monthly observation of two variables for a year >- Sales_2012_01, Sales_2012_02, Sales_2012_03, .... (total sales >for jan 2012,feb 2012, etc.) >- Customers_2012_01, Customers_2012_02, .... (total number of >customers for jan 2012, etc.) > >and I want to create new monthly variables in order to compute >revenues per customers: > >Av_revenue_2012_01 = Sales_2012_01 / Customers_2012_01 >Av_revenue_2012_02 = Sales_2012_02 / Customers_2012_02 >... > >how can I proceed? > > >In other programming language I used just to write something like >for (i in list("01","02, ..., "12") { >Av_revenue_2012_'i' = Sales_2012_'i' / Customers_2012_'i' >} > >but in R it seems not to work like that. Further, and correct me if I >am wrong, I cannot use simple (i in 1:12) since I have a 0 digit in >front of the single-digit months. > >thanks in advance for your help > >______________________________________________ >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.