R 基于两个表之间的日期逻辑计算列
我想根据表之间的逻辑计算一列。让我解释一下,给定具有此结构的data.frame:R 基于两个表之间的日期逻辑计算列,r,dplyr,R,Dplyr,我想根据表之间的逻辑计算一列。让我解释一下,给定具有此结构的data.frame: Transaction - Start - End - Quantity - Area (Number) - (Date) - (Date) - (Number) - (Number) 开始和结束确定事务在区域中的时间。我想计算每天每个区域的库存量 什么是股票? 遵循此逻辑的数量总和: Start <= day AND End >= day OR Start <= day AND End ==
Transaction - Start - End - Quantity - Area
(Number) - (Date) - (Date) - (Number) - (Number)
开始
和结束
确定事务
在区域
中的时间。我想计算每天每个区域的库存量
什么是股票?
遵循此逻辑的数量总和:
Start <= day AND End >= day
OR
Start <= day AND End == NULL
或:
Edit3:
这种方法有以下原则:
你需要每天计算你的股票,但你有一个天数范围。因此,我们必须将天数范围转换为单个天数,同时保留其余数据,然后按如下方式分组和计数。
然而,你有“恼人的”NAs,因此我们必须首先摆脱它们。因为当<强>结束<强>日期>强> n<强>时,您仍想将事务视为正在进行,首先我将<强> NAs < /强>转换为日历日历数据框的最大日期,因此我们将在以后将其计数为1,直到Max:
df$End <- as.Date(ifelse(is.na(df$End), max(calendar$Date), df$End), origin = "1970-01-01")
> df
Transaction Start End Quantity Area
1 299784 2019-01-01 2019-01-05 1 7065
2 299785 2019-01-01 2019-01-04 1 7065
3 301913 2019-01-02 2019-01-06 1 7065
4 302840 2019-01-02 2019-01-03 1 7065
5 305722 2019-01-03 2019-01-10 1 7065
6 285874 2019-01-01 2019-01-05 1 6098
7 285875 2019-01-01 2019-01-04 1 6098
8 312587 2019-01-02 2019-01-06 1 6098
9 326842 2019-01-02 2019-01-03 1 6098
10 328521 2019-01-03 2019-01-10 1 6098
我们的新数据框nf现在有一个新的开始日期,该日期对应于日期范围内唯一的每个交易/数量/区域组合
> nf
# A tibble: 48 x 6
# Groups: row_number() [10]
`row_number()` Start Transaction End Quantity Area
<int> <date> <dbl> <date> <dbl> <dbl>
1 1 2019-01-01 299784 2019-01-05 1 7065
2 1 2019-01-02 299784 2019-01-05 1 7065
3 1 2019-01-03 299784 2019-01-05 1 7065
4 1 2019-01-04 299784 2019-01-05 1 7065
5 1 2019-01-05 299784 2019-01-05 1 7065
6 2 2019-01-01 299785 2019-01-04 1 7065
7 2 2019-01-02 299785 2019-01-04 1 7065
8 2 2019-01-03 299785 2019-01-04 1 7065
9 2 2019-01-04 299785 2019-01-04 1 7065
10 3 2019-01-02 301913 2019-01-06 1 7065
# … with 38 more rows
这将根据您的计数(n)在新列上展开列区域。
最后,您需要做的就是保留日历中存在的日期
希望这有帮助 嗨,谢谢你的回答。结束日期是相关的。例如,1月8日,7065区域的库存为1,因为有一笔交易(第5行“df”)未结,这意味着2018-01-03我现在明白你的意思了-我当时误解了复杂性。问题:在你的日历上,你有2019年的数据帧,在你的df上,你有2018年的数据帧。这是打字错误吗?否则所有的日子都将>超过你的df$结束。我正在编辑我的回复,以反映您的评论。请检查我编辑的回复,让我知道这是否是您正在寻找的。很高兴它有帮助!顺便说一句,我在分组中犯了一个错误:您需要使用tally(Quantity)
而不是count()
,因为我们需要的是数量的总和,而不仅仅是出现的日期数。我做了最后的编辑。祝你好运,继续努力!
Date 7065 6098
1 2019-01-01 2 2
2 2019-01-02 4 4
3 2019-01-03 5 5
4 2019-01-04 4 4
5 2019-01-05 3 3
6 2019-01-06 1 1
7 2019-01-07 1 1
8 2019-01-08 1 1
9 2019-01-09 1 1
10 2019-01-10 1 1
df$End <- as.Date(ifelse(is.na(df$End), max(calendar$Date), df$End), origin = "1970-01-01")
> df
Transaction Start End Quantity Area
1 299784 2019-01-01 2019-01-05 1 7065
2 299785 2019-01-01 2019-01-04 1 7065
3 301913 2019-01-02 2019-01-06 1 7065
4 302840 2019-01-02 2019-01-03 1 7065
5 305722 2019-01-03 2019-01-10 1 7065
6 285874 2019-01-01 2019-01-05 1 6098
7 285875 2019-01-01 2019-01-04 1 6098
8 312587 2019-01-02 2019-01-06 1 6098
9 326842 2019-01-02 2019-01-03 1 6098
10 328521 2019-01-03 2019-01-10 1 6098
library(tidyr)
nf <- df %>% group_by(row_number()) %>% complete(Start=seq.Date(max(Start), max(End), by='day')) %>% fill(Transaction, End, Quantity, Area)
> nf
# A tibble: 48 x 6
# Groups: row_number() [10]
`row_number()` Start Transaction End Quantity Area
<int> <date> <dbl> <date> <dbl> <dbl>
1 1 2019-01-01 299784 2019-01-05 1 7065
2 1 2019-01-02 299784 2019-01-05 1 7065
3 1 2019-01-03 299784 2019-01-05 1 7065
4 1 2019-01-04 299784 2019-01-05 1 7065
5 1 2019-01-05 299784 2019-01-05 1 7065
6 2 2019-01-01 299785 2019-01-04 1 7065
7 2 2019-01-02 299785 2019-01-04 1 7065
8 2 2019-01-03 299785 2019-01-04 1 7065
9 2 2019-01-04 299785 2019-01-04 1 7065
10 3 2019-01-02 301913 2019-01-06 1 7065
# … with 38 more rows
zf <- nf %>% group_by(Start, Area) %>% tally(Quantity)
> zf
# A tibble: 20 x 3
# Groups: Start [10]
Start Area n
<date> <dbl> <dbl>
1 2019-01-01 6098 2
2 2019-01-01 7065 2
3 2019-01-02 6098 4
4 2019-01-02 7065 4
5 2019-01-03 6098 5
6 2019-01-03 7065 5
7 2019-01-04 6098 4
8 2019-01-04 7065 4
9 2019-01-05 6098 3
10 2019-01-05 7065 3
11 2019-01-06 6098 2
12 2019-01-06 7065 2
13 2019-01-07 6098 1
14 2019-01-07 7065 1
15 2019-01-08 6098 1
16 2019-01-08 7065 1
17 2019-01-09 6098 1
18 2019-01-09 7065 1
19 2019-01-10 6098 1
20 2019-01-10 7065 1
zf <- zf %>% spread(Area, n)
>zf
# A tibble: 10 x 3
# Groups: Start [10]
Start `6098` `7065`
<date> <dbl> <dbl>
1 2019-01-01 2 2
2 2019-01-02 4 4
3 2019-01-03 5 5
4 2019-01-04 4 4
5 2019-01-05 3 3
6 2019-01-06 2 2
7 2019-01-07 1 1
8 2019-01-08 1 1
9 2019-01-09 1 1
10 2019-01-10 1 1