如何从R中的两个数据帧获取日期差异

时间:2018-03-27 10:41:59

标签: r dataframe dplyr tidyr

我提到了两个datafram:

DF_1

ID         Date1       Count
1          12/01/2017   7
2          15/02/2017   0
3          18/03/2017  -4

DF_2

    if (v[i]<=v[i+1];break)

我想计算DF_1中特定ID与DF_2中相同ID的日期之间的差异,DF_2中最近的旧日期与DF_1的日期进行比较。

例如:对于ID = 1,DF_1的日期是12-01-2017,而DF_2中的最近旧日期将是05-01-2017,因为15&amp; 18都是&gt;比DF_1日期。

必需输出:

break

2 个答案:

答案 0 :(得分:0)

以下内容将再现您的预期输出:

library(tidyverse);

df1 <- read.table(text =
    "ID         Date1
1          12/01/2017
2          15/02/2017
3          18/03/2017", header = T) %>%
mutate(Date1 = as.Date(Date1, format = "%d/%m/%Y"));


df2 <- read.table(text =
    "ID         Date1
1          05/01/2017
1          15/01/2017
1          18/01/2017
2          10/02/2017
2          13/02/2017
2          15/02/2017
3          22/03/2017", header = T)  %>%
mutate(Date1 = as.Date(Date1, format = "%d/%m/%Y"));


left_join(df1, df2, by = "ID") %>%
    mutate(Count = Date1.x - Date1.y) %>%
    group_by(ID) %>%
    slice(ifelse(
        all(Count < 0), 
        which.min(abs(Count)), 
        which.min(Count[Count >= 0]))) %>%
    select(ID, Date1.x, Count)

## A tibble: 3 x 3
## Groups:   ID [3]
#     ID Date1.x    Count
#  <int> <date>     <time>
#1     1 2017-01-12 7
#2     2 2017-02-15 0
#3     3 2017-03-18 -4

说明:计算df1$Date1df2$Date2之间的时差,按ID分组,并且只保留具有最小正时差的行,除非所有时差都为负在这种情况下报告最小的绝对时间差。

答案 1 :(得分:0)

我认为您的最后一行是错误的,因为ID=3 df2值不在df1值之前。假设这是正确的,你可以这样做......

df3 <- df2 %>% rename(Date2=Date1) %>% 
  left_join(df1) %>% 
  mutate(datediff=as.Date(Date1,format="%d/%m/%Y")-as.Date(Date2,format="%d/%m/%Y")) %>% 
  filter(datediff>=0) %>% 
  group_by(ID) %>% 
  summarise(Date1=first(Date1),Count=min(datediff))

df3
     ID Date1      Count 
1     1 12/01/2017 7     
2     2 15/02/2017 0