R如何计算变化百分比'两排之间?

时间:2016-03-20 06:47:32

标签: r

  • 我喜欢计算两行之间的变化百分比'而物品 行的变化。
  • 对于第一行项目,我可以放置一些文本或空白 (例如'skip'或空白是好的)因为没有前一行的比较 项目

    df <- data.frame(period=rep(1:4,2), 
                 farm=c(rep('A',4),rep('B',4)), 
                 cumVol=c(1,5,15,31,10,12,16,24), item=c(rep('Z',3),rep('Y',3),rep('X',2)),
                 other = 1:8);
    

我希望得出的&#39; Percentage_Change&#39;列(数据集的附加列)如下所示。 (公式:100 /上一项行值*当前行项目值...第二行示例..100 / 1 * 5 = 500)

Row Percentage_Change
1   Skip
2   500
3   300
4   Skip
5   32.25806452
6   120
7   Skip
8   150

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

dplyr可以做同样的事情。这完全类似于akrun的答案,但使用其他语法。

library(dplyr)
mutate(df, Row = 1:n()) %>%
  group_by(item) %>%
  mutate(Percentage_Change = cumVol/lag(cumVol) * 100) %>%
  ungroup %>%
  select(Row, Percentage_Change)
## Source: local data frame [8 x 2]
## 
##     Row Percentage_Change
##   (int)             (dbl)
## 1     1                NA
## 2     2         500.00000
## 3     3         300.00000
## 4     4                NA
## 5     5          32.25806
## 6     6         120.00000
## 7     7                NA
## 8     8         150.00000

答案 1 :(得分:2)

我们可以使用shift中的data.table。将'data.frame'转换为'data.table'(setDt(df)),按'item'分组,我们从.I获取“Row”并通过除以“cumVol”创建“Percentage_Change” “由lag的”cumVol“(由shift得到)并乘以100.如果需要,可以通过将(:=)赋值为NULL来删除分组列。

library(data.table)
setDT(df)[, list(Row = .I, Percentage_Change=round(cumVol*
   (100/shift(cumVol)),2)), .(item)][, item := list(NULL)][]
#   Row Percentage_Change
#1:   1               NA
#2:   2           500.00
#3:   3           300.00
#4:   4               NA
#5:   5            32.26
#6:   6           120.00
#7:   7               NA
#8:   8           150.00

注意:这为没有比较的元素提供NA,而不是Skip