Wow, Mr Petr. The placing of diff(fyear1) was very clever indeed. Just
to understand the steps intended by you-

exp(diff(log(sales1))/diff(fyear1))- 1)
= exp(((log(sales1(t)/sales1(t-1)))/(fyear1(t)-fyear(t-1)))-1)
= exp(log(sales(t)/sales(t-1))^(1/(delta(fyear1))))-1
= ((sales(t)/(sales(t-1)))^(1/(delta(fyear1)))-1

This gives the CAGR, which saves some precious data-points (in my
dataset, it may prove a big boon). I spent a significant amount of
time today to figure out something like this, which you did so easily.

Many Thanks,

Brijesh

On Thu, Dec 15, 2016 at 7:21 PM, PIKAL Petr <petr.pi...@precheza.cz> wrote:
> Hi
>
> Maybe you does not need if or ifelse but just divide by years difference.
>
> d2<-ddply(df1,"co_code1",transform, 
> growth=c(NA,exp(diff(log(sales1))/diff(fyear1))- 1)*100)
>
> Cheers
> Petr
>
>> -----Original Message-----
>> From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Berend
>> Hasselman
>> Sent: Thursday, December 15, 2016 1:18 PM
>> To: Brijesh Mishra <brijeshkmis...@gmail.com>
>> Cc: r-help mailing list <r-help@r-project.org>
>> Subject: Re: [R] Computing growth rate
>>
>>
>> > On 15 Dec 2016, at 04:40, Brijesh Mishra <brijeshkmis...@gmail.com>
>> wrote:
>> >
>> > Hi,
>> >
>> > I am trying to calculate growth rate (say, sales, though it is to be
>> > computed for many variables) in a panel data set. Problem is that I
>> > have missing data for many firms for many years. To put it simply, I
>> > have created this short dataframe (original df id much bigger)
>> >
>> > df1<-data.frame(co_code1=rep(c(1100, 1200, 1300), each=7),
>> > fyear1=rep(1990:1996, 3), sales1=rep(seq(1000,1600, by=100),3))
>> >
>> > # this gives me
>> > co_code1 fyear1 sales1
>> > 1      1100   1990   1000
>> > 2      1100   1991   1100
>> > 3      1100   1992   1200
>> > 4      1100   1993   1300
>> > 5      1100   1994   1400
>> > 6      1100   1995   1500
>> > 7      1100   1996   1600
>> > 8      1200   1990   1000
>> > 9      1200   1991   1100
>> > 10     1200   1992   1200
>> > 11     1200   1993   1300
>> > 12     1200   1994   1400
>> > 13     1200   1995   1500
>> > 14     1200   1996   1600
>> > 15     1300   1990   1000
>> > 16     1300   1991   1100
>> > 17     1300   1992   1200
>> > 18     1300   1993   1300
>> > 19     1300   1994   1400
>> > 20     1300   1995   1500
>> > 21     1300   1996   1600
>> >
>> > # I am now removing a couple of rows
>> > df1<-df1[-c(5, 8), ]
>> > # the result is
>> >   co_code1 fyear1 sales1
>> > 1      1100   1990   1000
>> > 2      1100   1991   1100
>> > 3      1100   1992   1200
>> > 4      1100   1993   1300
>> > 6      1100   1995   1500
>> > 7      1100   1996   1600
>> > 9      1200   1991   1100
>> > 10     1200   1992   1200
>> > 11     1200   1993   1300
>> > 12     1200   1994   1400
>> > 13     1200   1995   1500
>> > 14     1200   1996   1600
>> > 15     1300   1990   1000
>> > 16     1300   1991   1100
>> > 17     1300   1992   1200
>> > 18     1300   1993   1300
>> > 19     1300   1994   1400
>> > 20     1300   1995   1500
>> > 21     1300   1996   1600
>> > # so 1994 for co_code1 1100 and 1990 for co_code1 1200 have been
>> > removed. If I try,
>> > d<-ddply(df1,"co_code1",transform, growth=c(NA,exp(diff(log(sales1)))-
>> 1)*100)
>> >
>> > # this apparently gives wrong results for the year 1995 (as shown
>> > below) as growth rates are computed considering yearly increment.
>> >
>> >   co_code1 fyear1 sales1    growth
>> > 1      1100   1990   1000        NA
>> > 2      1100   1991   1100 10.000000
>> > 3      1100   1992   1200  9.090909
>> > 4      1100   1993   1300  8.333333
>> > 5      1100   1995   1500 15.384615
>> > 6      1100   1996   1600  6.666667
>> > 7      1200   1991   1100        NA
>> > 8      1200   1992   1200  9.090909
>> > 9      1200   1993   1300  8.333333
>> > 10     1200   1994   1400  7.692308
>> > 11     1200   1995   1500  7.142857
>> > 12     1200   1996   1600  6.666667
>> > 13     1300   1990   1000        NA
>> > 14     1300   1991   1100 10.000000
>> > 15     1300   1992   1200  9.090909
>> > 16     1300   1993   1300  8.333333
>> > 17     1300   1994   1400  7.692308
>> > 18     1300   1995   1500  7.142857
>> > 19     1300   1996   1600  6.666667
>> > # I thought of using the formula only when the increment of fyear1 is
>> > only 1 while in a co_code1, by using this formula
>> >
>> > d<-ddply(df1,
>> >         "co_code1",
>> >         transform,
>> >         if(diff(fyear1)==1){
>> >           growth=(exp(diff(log(df1$sales1)))-1)*100
>> >         } else{
>> >           growth=NA
>> >         })
>> >
>> > But, this doesn't work. I am getting the following error.
>> >
>> > In if (diff(fyear1) == 1) { :
>> >  the condition has length > 1 and only the first element will be used
>> > (repeated a few times).
>> >
>> > # I have searched for a solution, but somehow couldn't get one. Hope
>> > that some kind soul will guide me here.
>> >
>>
>> In your case use ifelse() as explained by Rui.
>> But it can be done more easily since the fyear1 and co_code1 are
>> synchronized.
>> Add a new column to df1 like this
>>
>> df1$growth <- c(NA,
>>          ifelse(diff(df1$fyear1)==1,
>>                     (exp(diff(log(df1$sales1)))-1)*100,
>>                     NA
>>                     )
>>         )
>>
>> and display df1. From your request I cannot determine if this is what you
>> want.
>>
>> regards,
>>
>> Berend Hasselman
>>
>> ______________________________________________
>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>
> ________________________________
> Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a jsou 
> určeny pouze jeho adresátům.
> Jestliže jste obdržel(a) tento e-mail omylem, informujte laskavě neprodleně 
> jeho odesílatele. Obsah tohoto emailu i s přílohami a jeho kopie vymažte ze 
> svého systému.
> Nejste-li zamýšleným adresátem tohoto emailu, nejste oprávněni tento email 
> jakkoliv užívat, rozšiřovat, kopírovat či zveřejňovat.
> Odesílatel e-mailu neodpovídá za eventuální škodu způsobenou modifikacemi či 
> zpožděním přenosu e-mailu.
>
> V případě, že je tento e-mail součástí obchodního jednání:
> - vyhrazuje si odesílatel právo ukončit kdykoliv jednání o uzavření smlouvy, 
> a to z jakéhokoliv důvodu i bez uvedení důvodu.
> - a obsahuje-li nabídku, je adresát oprávněn nabídku bezodkladně přijmout; 
> Odesílatel tohoto e-mailu (nabídky) vylučuje přijetí nabídky ze strany 
> příjemce s dodatkem či odchylkou.
> - trvá odesílatel na tom, že příslušná smlouva je uzavřena teprve výslovným 
> dosažením shody na všech jejích náležitostech.
> - odesílatel tohoto emailu informuje, že není oprávněn uzavírat za společnost 
> žádné smlouvy s výjimkou případů, kdy k tomu byl písemně zmocněn nebo písemně 
> pověřen a takové pověření nebo plná moc byly adresátovi tohoto emailu 
> případně osobě, kterou adresát zastupuje, předloženy nebo jejich existence je 
> adresátovi či osobě jím zastoupené známá.
>
> This e-mail and any documents attached to it may be confidential and are 
> intended only for its intended recipients.
> If you received this e-mail by mistake, please immediately inform its sender. 
> Delete the contents of this e-mail with all attachments and its copies from 
> your system.
> If you are not the intended recipient of this e-mail, you are not authorized 
> to use, disseminate, copy or disclose this e-mail in any manner.
> The sender of this e-mail shall not be liable for any possible damage caused 
> by modifications of the e-mail or by delay with transfer of the email.
>
> In case that this e-mail forms part of business dealings:
> - the sender reserves the right to end negotiations about entering into a 
> contract in any time, for any reason, and without stating any reasoning.
> - if the e-mail contains an offer, the recipient is entitled to immediately 
> accept such offer; The sender of this e-mail (offer) excludes any acceptance 
> of the offer on the part of the recipient containing any amendment or 
> variation.
> - the sender insists on that the respective contract is concluded only upon 
> an express mutual agreement on all its aspects.
> - the sender of this e-mail informs that he/she is not authorized to enter 
> into any contracts on behalf of the company except for cases in which he/she 
> is expressly authorized to do so in writing, and such authorization or power 
> of attorney is submitted to the recipient or the person represented by the 
> recipient, or the existence of such authorization is known to the recipient 
> of the person represented by the recipient.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to