如何使用R计算两行之间的“变化百分比”?

5
  • I like to compute 'Percentage of change between two rows' while Item changes in rows.
  • For first row of items, I am ok to place some text or blank (example ‘skip’ or blank is ok) because of no comparison of previous row for same item

    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);
    

我希望在数据集上添加一个名为“Percentage_Change”的附加列,并且该列的输出结果如下所示。(公式: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

感谢您的所有帮助。

我可以跳过第一行没有文本、空白或零的情况。 - Murali
你能检查一下第五个值吗? - akrun
第五个值是错误的。它应该是32.25。看起来它只计算了超过100%的部分。 - Murali
你能展示一下你是怎么得到那个值的吗? - akrun
第五个值是....100/31(第四行的值)* 10(第五行的值)= 32.25 - Murali
我修改了代码。仅使用“item”作为组。现在它可以工作了。 - akrun
2个回答

5
可以使用 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

2
我们可以使用data.table中的shift。将'data.frame'转换为'data.table' (setDt(df)),按'item'分组,我们从.I得到"Row",通过将"cumVol"除以"cumVol"的lag(通过shift得到)并乘以100来创建"Percentage_Change"。如果需要,可以通过将(:=)赋值为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


@Akrun..你能帮我看看第五个值吗?我忽略了那个值。 - Murali
1
@Murali,已经更改了,请检查。 - akrun
1
我刚刚在我的大数据集上测试了代码,对于少于100个值的情况下完美运行。做得很好,我爱你 :-) - Murali
你如何将此应用于类别-1和1,以便 % 变化<= .8% 变化>= 1.2,并且还要回顾过去一小时的值,而不仅仅是最后一行? - zsad512
@zsad512 请将您的问题作为新问题发布,因为您的评论对我来说不太清楚。 - akrun
@akrun https://stackoverflow.com/questions/46084728/breaking-a-continuous-variable-into-categories-using-dplyr-and-or-cut/46086107?noredirect=1#comment79135217_46086107 - zsad512

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接