R发现快照数据的差异

时间:2014-07-24 14:51:04

标签: r

我是R的新手程序员。我正在搜索可以帮助我分析以下内容的库或函数。我每天订购所有未来订单的快照。以下是数据样本:

------------------------------
|createdat|orderdate|qty|total|
-------------------------------
|2014-07-20|2014-07-21|10|1000|
|2014-07-20|2014-07-22|10|1000|
|2014-07-20|2014-07-23|13|1300|
|2014-07-20|2014-07-24|12|1200|
|2014-07-21|2014-07-22|11|1100|
|2014-07-21|2014-07-23|12|1200|
|2014-07-21|2014-07-24|12|1200|
|2014-07-21|2014-07-25|12|1200|
-------------------------------

每天我都会收到一年的订单。我想要计算每日的提货量。 2014-07-23订单日期的例子是-1

有人可以建议我如何在R中计算这类事情吗?

2 个答案:

答案 0 :(得分:0)

首先介绍部分数据:

info= read.table(text="   createdat  orderdate qty total
 2014-07-20 2014-07-21  10  1000
 2014-07-20 2014-07-22  10  1000
 2014-07-20 2014-07-23  13  1300
 2014-07-21 2014-07-23  12  1200
 2014-07-21 2014-07-22  11  1100", header=TRUE)

现在我们可以找到表中的日期:

dates =  unique(info$orderdate)

for (i in 1:length(dates)){
   print(diff(info[orderdate == dates[i], "qty"]))
   print(as.character(dates[i]))}

输出:

#integer(0)
#[1] "2014-07-21"
#[1] 1
#[1] "2014-07-22"
#[1] -1
#[1] "2014-07-23"

该值是以下日期的差异。 您可以使用apply函数改进此代码,并改进它的输出以创建表,这里有另一个示例:

for (i in 1:length(dates)){
+        diffe=diff(info[orderdate == dates[i], "qty"])
+ date = as.character(dates[i])
+ v=c(diffe, date)
+ print(v)
+ }
#[1] "2014-07-21"
#[1] "1"          "2014-07-22"
#[1] "-1"         "2014-07-23"

答案 1 :(得分:0)

使用@ Llopis的精彩数据和dplyr

library(dplyr)
info %>% group_by(orderdate) %>%
    arrange(orderdate, createdat) %>%
    mutate(pickup = c(NA, diff(qty)))


   createdat  orderdate qty total pickup
1 2014-07-20 2014-07-21  10  1000     NA
2 2014-07-20 2014-07-22  10  1000     NA
3 2014-07-21 2014-07-22  11  1100      1
4 2014-07-20 2014-07-23  13  1300     NA
5 2014-07-21 2014-07-23  12  1200     -1

## adding a couple lines to filter

info %>% group_by(orderdate) %>%
    arrange(orderdate, createdat) %>%
    mutate(pickup = c(NA, diff(qty))) %>%
    filter(!is.na(pickup)) %>%
    select(orderdate, pickup)

   orderdate pickup
1 2014-07-22      1
2 2014-07-23     -1

快速介绍管道(%>%

%>%运算符被称为" pipe",简洁明了。它所做的只是将前面的data.frame(或由它之前的函数返回)作为第一个参数提供给下一个函数。在上面的例子中,我从

开始
info %>% group_by(order_date)
# which is equivalent to
group_by(info, order_date)

通常,dplyr函数始终将data.frame作为第一个参数,因此第一个参数的管道始终有效(如果您正在使用其他函数,则可以绕过该限制)。它们也类似subset,因为您可以按名称引用列,而无需键入$等。

对于一个功能,管道中没有任何意义,但是如果您正在执行多个功能,它可以让您按照您希望的顺序对它们进行编码 - 无需嵌套或分配中间件结果

我上面的第一个代码块可以改写为

# nesting, very hard to read and understand:
mutate(arrange(group_by(info, orderdate), createdat), pickup = c(NA, diff(qty)))

# one at a time, lots of typing and assigning
info2 <- group_by(info, orderdate)
info2 <- arrange(info2, createdat)
info2 <- mutate(info2, pickup = c(NA, diff(qty)))

但我更喜欢dplyr方式。