Computing growth rate
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.pikal at 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-bounces at r-project.org] On Behalf Of Berend Hasselman Sent: Thursday, December 15, 2016 1:18 PM To: Brijesh Mishra <brijeshkmishra at gmail.com> Cc: r-help mailing list <r-help at r-project.org> Subject: Re: [R] Computing growth rate
On 15 Dec 2016, at 04:40, Brijesh Mishra <brijeshkmishra at 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 at 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.