【问题标题】:Conditional calculation based on other columns lagged values基于其他列滞后值的条件计算
【发布时间】:2020-01-20 14:36:22
【问题描述】:

新手:我有一个数据集,我想在其中计算一家公司的销售额同比增长。数据集包含大约。 1000 家在公共证券交易所上市的不同年份的公司。数据如下所示:

#      gvkey fyear at    company name
#22    17436 2010  59393 BASF SE
#23    17436 2011  61175 BASF SE
#24    17436 2012  64327 BASF SE
       ...
#30    17436 2018  86556 BASF SE
#31    17828 1989  62737 DAIMLER AG
#32    17828 1990  67339 DAIMLER AG
#33    17828 1991  75714 DAIMLER AG
       ...
#60    17828 2018  281619  DAIMLER AG

我想创建一个新列 growth,在其中计算 at 的百分比增加,例如BASF SE (gvkey 17436) 从 2010 年到 2011 年,到 2012 年等等。在第 31 行,条件语句应该起作用,它不会根据属于 BASF 的值而是具有 NA 值来计算增加。因此,第 32 行新列“增长”的下一个值将是 DAIMLER (gvkey 17828) 从 62727 到 67339 的百分比增长

到目前为止我尝试过:

if TA$gvkey == lag(TA$gvkey) {mutate(TA, growth = (at - lag(at))/lag(at))} else {NULL}

基本上,我尝试根据 gvkey 标识符的更改来调整计算,因为这对我来说最有意义。我相信有一种更好的方法可以运行一个循环,直到 gvkey 更改并继续使用下一组值 - 但我根本不知道如何编写代码。

我对 R 很陌生,很迷茫。我会感谢每一个支持!谢谢各位:)

【问题讨论】:

    标签: r if-statement time-series conditional-statements


    【解决方案1】:

    我没有看到一种方法可以在一行中做到这一点。假设您的数据称为数据,您可以尝试:

    for(i in data$gvkey){
      a = subset(data,data$gvkey==i)  # a now contains the data of one company
      # calculate pairwise relative difference (assumes sorted years!)
      rel_diff = diff(a)/head(a,-1)   #diff computes pariwise difference and divide by a ( head(a,-1) removes the last element)
      a$growth = c(0,rel_diff) # extend data frame by result, first difference is 0
      #output tro somewhere
    }
    

    这是一个带有 r-base 的解决方案。可能有更有效的方法,但这很容易理解。

    【讨论】:

      【解决方案2】:

      在这种情况下,dplyr 中的 group_by 函数是一个很好的工具。通过 group_by() 输入 gv 列,您将分割出您的 mutate() 调用,以分别应用于 gv 的每个不同值。这是我用一些虚拟数据和您的相同列值制作的一个简单示例:

      library(dplyr)
      
      dummyData = 
        data.frame(gvkey = c(111,111,111,222,222,222), 
                   fyear = c(2010,2012,2011,2010,2011,2013), 
                   at =c(2,4,2,4,5,10)
                   )
      
      dummyDataTransformed = dummyData %>% 
        group_by(gvkey) %>% 
        arrange(fyear) %>% #to make sure we are chronologically in order
        mutate(growth = at/lag(at,1) -1) %>% #subtract 1 to get year over year change
        ungroup() #I like to ungroup just to make sure i'm not bugging out any calculations I might add further down the line
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多