R使用diff得到正/负delta

时间:2013-10-24 16:23:36

标签: r time-series zoo

我有一个时间序列数据已导入为动物园类。我的数据看起来像这样:

# you can recreate my problem using the code below
library(rjson)
library(plyr)
library(zoo)
value <- '[["2013-08-08", 7944, 0.37], ["2013-08-09", 7924, 0.37], ["2013-08-09", 7924, 0.37], ["2013-08-10", 7895, 0.37], ["2013-08-10", 7895, 0.37], ["2013-08-11", 7895, 0.37], ["2013-08-12", 7895, 0.37], ["2013-08-12", 7895, 0.37], ["2013-08-13", 8087, 0.37], ["2013-08-13", 8087, 0.37], ["2013-08-14", 8081, 0.37], ["2013-08-14", 8081, 0.37], ["2013-08-15", 8016, 0.37], ["2013-08-15", 8016, 0.37], ["2013-08-16", 7991, 0.37], ["2013-08-16", 7991, 0.37], ["2013-08-17", 7969, 0.37], ["2013-08-17", 7969, 0.37], ["2013-08-18", 7969, 0.37], ["2013-08-18", 7969, 0.37], ["2013-08-19", 7969, 0.37], ["2013-08-19", 7969, 0.37], ["2013-08-20", 3931, 0.37], ["2013-08-20", 3931, 0.37], ["2013-08-21", 3829, 0.37], ["2013-08-21", 3829, 0.37], ["2013-08-22", 3729, 0.37], ["2013-08-22", 3729, 0.37], ["2013-08-23", 3729, 0.37], ["2013-08-23", 3729, 0.37], ["2013-08-24", 3719, 0.37], ["2013-08-24", 3719, 0.37], ["2013-08-25", 3719, 0.37], ["2013-08-25", 3719, 0.37], ["2013-08-26", 3719, 0.37], ["2013-08-26", 3719, 0.37], ["2013-08-27", 7569, 0.37], ["2013-08-27", 7569, 0.37], ["2013-08-28", 7444, 0.37], ["2013-08-28", 7444, 0.37], ["2013-08-29", 7444, 0.37], ["2013-08-29", 7444, 0.37], ["2013-08-30", 7439, 0.37], ["2013-08-30", 7439, 0.37], ["2013-08-31", 7419, 0.37], ["2013-08-31", 7419, 0.37], ["2013-09-01", 7419, 0.37], ["2013-09-01", 7419, 0.37], ["2013-09-02", 7419, 0.37], ["2013-09-02", 7419, 0.37], ["2013-09-03", 7219, 0.37], ["2013-09-03", 7219, 0.37], ["2013-09-05", 7001, 0.37], ["2013-09-06", 6999, 0.37], ["2013-09-07", 2749, 0.37], ["2013-09-08", 2749, 0.37], ["2013-09-08", 2749, 0.37], ["2013-09-09", 2749, 0.37]]'
content <- as.data.frame(matrix(unlist(fromJSON(json_str=.value)),ncol=3,byrow=TRUE))
names(content) <- c('date', 'inStock', 'unitPrice')
content$date <- as.POSIXct(content$date, format="%Y-%m-%d")
content$inStock <- as.integer(levels(content$inStock))[content$inStock]
content$unitPrice <- as.numeric(levels(content$unitPrice))[content$unitPrice]
content <- ddply(content, .(date), summarise, inventoryValue = max(inStock) * min(unitPrice), inStock = max(inStock), unitPrice = min(unitPrice))
content.zoo <- zoo(content[-1], content$date)
content.complete <- na.approx(content.zoo, xout=seq(start(content.zoo), end(content.zoo), by="day"))
plot(content.complete[,1])

enter image description here

您可以在8月20日轻松看到库存下降到1500,并且库存在8月25日得到补充。

如何使用diff函数计算销售额,这只是负增量 或将所有正delta(补货)指定为0

# the plot below shows all the delta but I only want the negative delta
plot(-diff(content.complete[,1]))

enter image description here

以一种简单的方式。你有一个矢量:

a <- c(1,2,3,4,-1,-2,4,5, 0)
# how can I get 
c(1,2,3,4,0,0,4,5,0)

更新:

#Inspired by pmax answer, this is my final solution:
plot(zoo(pmax(0, as.vector(-diff(content.complete[,1]))), seq(start(content.complete), end(content.complete), by="day")))

2 个答案:

答案 0 :(得分:2)

一种方法是使用pmax

> pmax(0,a)
[1] 1 2 3 4 0 0 4 5 0

答案 1 :(得分:0)

鉴于我正确理解了您的问题:您是否无法使用which()功能

index <- which(-diff(content.complete[,1]) < 0.0)

返回diff给出否定结果的索引?

a <- rnorm(10)
[1]  0.79466221 -0.02602763 -0.08978353  2.66642150  0.10041665 -1.57871469
[7] -0.33173812 -0.70527085  0.01021448 -0.43410244

index <- which(diff(a) < 0)
[1] 1 2 4 5 7 9