Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于两个表之间的日期逻辑计算列_R_Dplyr - Fatal编程技术网

R 基于两个表之间的日期逻辑计算列

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 ==

我想根据表之间的逻辑计算一列。让我解释一下,给定具有此结构的data.frame:

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