【问题标题】:R how to calculate 'Percentage of Change' between two rows?R如何计算两行之间的“变化百分比”?
【发布时间】:2016-03-20 20:22:52
【问题描述】:
  • 我喜欢计算“两行之间的变化百分比”,而 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/Previous Item 行值 * 当前行 Item 值...以第 2 行为例..100/1 * 5 = 500)

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

感谢您的所有帮助。

【问题讨论】:

  • 我可以跳过没有文本或空白或零的第一行
  • 你能检查第五个值吗?
  • 第五个值是错误的。它应该是 32.25。似乎它只计算了 100% 以上。
  • 你能说明你是如何得到这个值的吗?
  • 第 5 个值是 ....100/31(第 4 行值)* 10(第 5 行值)= 32.25

标签: r


【解决方案1】:

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”除以 @ 创建“Percentage_Change” “cumVol”的 987654325@(由 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

    【讨论】:

    • @Akrun..你能帮我解决第五个问题吗?我确实忽略了这个价值。
    • @Murali 已更改。请检查
    • 我刚刚在我的大数据集上测试了代码,并且对于少于 100 个值来说是完美的。干得好,我爱你 :-)
    • 您如何将其应用于 % change &lt;= .8% change &gt;= 1.2 的类别 -1 和 1 以及回顾过去一小时的值,而不仅仅是最后一行
    • @zsad512 请作为新问题发布,因为我不清楚您的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多