【问题标题】:Apply a function rowwise for calculating percentage changes in R [duplicate]逐行应用函数来计算R中的百分比变化[重复]
【发布时间】:2017-03-24 07:32:10
【问题描述】:

我拥有集团-国家-品牌级别的长格式年度时间序列数据。我想应用一个函数来计算每个级别的同比增长率。​​p>

基本上是(当前值/先前值)-1

在下面找到数据的摘录:

Grp Sta Brnd     Yr      Sls
A   AL  Ben's   2012    29770
A   AL  Ben's   2013    23357
A   AL  Ben's   2014    22442
A   AL  Ben's   2015    21848
A   AL  Ben's   2016    13799
B   CA  Scott's 2012    1079
B   CA  Scott's 2013    11178
B   CA  Scott's 2014    14778
B   CA  Scott's 2015    15241
B   CA  Scott's 2016    10569
C   TX  Joey's  2012    1673
C   TX  Joey's  2013    1290
C   TX  Joey's  2014    899
C   TX  Joey's  2015    732
C   TX  Joey's  2016    294

基本上,grp-state-brand 的每个唯一级别是 5 行。

Grp Sta Brnd     Yr      Sls    Grwth
A   AL  Ben's   2012    29770   
A   AL  Ben's   2013    23357   -22%
A   AL  Ben's   2014    22442   -4%
A   AL  Ben's   2015    21848   -3%
A   AL  Ben's   2016    13799   -37%
B   CA  Scott's 2012    1079    
B   CA  Scott's 2013    11178   936%
B   CA  Scott's 2014    14778   32%
B   CA  Scott's 2015    15241   3%
B   CA  Scott's 2016    10569   -23%
C   TX  Joey's  2012    1673    
C   TX  Joey's  2013    1290    -23%
C   TX  Joey's  2014    899     -30%
C   TX  Joey's  2015    732     -19%
C   TX  Joey's  2016    294     -60%

【问题讨论】:

  • 还有一个data.table() 解决方案:dt[, Grwth := (round(Sls/shift(Sls, type = 'lag'), 2)*100)-100, by = c('Grp', 'Brnd')]

标签: r time-series percentage data-manipulation


【解决方案1】:

base R

df$Grwth <- ave(df$Sls, df$Grp, df$Sta, df$Brnd, FUN = function(x) 
                                                   round((x/lag(x) -  1)*100))
df
#   Grp Sta   Brnd   Yr   Sls Grwth
#1    A  AL   Bens 2012 29770    NA
#2    A  AL   Bens 2013 23357   -22
#3    A  AL   Bens 2014 22442    -4
#4    A  AL   Bens 2015 21848    -3
#5    A  AL   Bens 2016 13799   -37
#6    B  CA Scotts 2012  1079    NA
#7    B  CA Scotts 2013 11178   936
#8    B  CA Scotts 2014 14778    32
#9    B  CA Scotts 2015 15241     3
#10   B  CA Scotts 2016 10569   -31
#11   C  TX  Joeys 2012  1673    NA
#12   C  TX  Joeys 2013  1290   -23
#13   C  TX  Joeys 2014   899   -30
#14   C  TX  Joeys 2015   732   -19
#15   C  TX  Joeys 2016   294   -60

【讨论】:

  • 嘿,我收到这个错误,我不知道为什么“总结时出错:无法将 'tsp' 分配给零长度向量”
  • 除了示例中显示的这一列之外,您还有其他列吗?
  • 是的,我知道,这是导致问题的原因吗?
  • 我是这么认为的。因为代码正在处理此处提供的示例集。
【解决方案2】:
df=data.frame(Grp = c(rep("A",5),rep("B",5),rep("C",5)), Sta = c(rep("AL",5),rep("CA",5),rep("TX",5)), 
          Brnd = c(rep("Ben's",5),rep("Scott's",5),rep("Joey's",5)), 
          Yr=rep(c(2012,2013,2014,2015,2016),3), 
          Sls = c(29770,23357,22442,21848,13799,1079,11178,14778,15241,10569,1673,1290,899,732,294))


ddply(df, .(Grp,Sta,Brnd),mutate, y = sprintf("%.2f%%",c(NA,100*diff(Sls)/Sls[-length(Sls)])))


   Grp Sta    Brnd   Yr   Sls       y
1    A  AL   Ben's 2012 29770     NA%
2    A  AL   Ben's 2013 23357 -21.54%
3    A  AL   Ben's 2014 22442  -3.92%
4    A  AL   Ben's 2015 21848  -2.65%
5    A  AL   Ben's 2016 13799 -36.84%
6    B  CA Scott's 2012  1079     NA%
7    B  CA Scott's 2013 11178 935.96%
8    B  CA Scott's 2014 14778  32.21%
9    B  CA Scott's 2015 15241   3.13%
10   B  CA Scott's 2016 10569 -30.65%
11   C  TX  Joey's 2012  1673     NA%
12   C  TX  Joey's 2013  1290 -22.89%
13   C  TX  Joey's 2014   899 -30.31%
14   C  TX  Joey's 2015   732 -18.58%
15   C  TX  Joey's 2016   294 -59.84%

【讨论】:

  • 这些值是否以字符形式出现?如果你能详细解释一下代码,我可以解决这个问题
  • @user36176 确定!所以 sprintf() 是一个 C 函数,它可以帮助我们在该列中添加“%”符号。所以是的,这将是性格。 “.2f”部分是指将数字四舍五入到小数点后两位,是一个浮点数。
  • so ddply() 首先按数据分组 - 然后为每个组计算百分比增加/减少。我明确插入一个 NA 作为每个组的第一个元素,并使用“-length(Sls)”,因为最后一个元素不会用于计算
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多