我是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中计算这类事情吗?
答案 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
方式。