【问题标题】:How to get date difference from two dataframe in R如何从R中的两个数据框获取日期差异
【发布时间】:2018-03-27 10:41:59
【问题描述】:

如前所述,我有两个数据帧:

DF_1

ID         Date1
1          12/01/2017
2          15/02/2017
3          18/03/2017

DF_2

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

我想计算 DF_1 中特定 id 的日期与 DF_2 中相同 id 的日期与 DF_2 中最近的旧日期与 DF_1 日期之间的差异。

例如:对于 ID=1,DF_1 的日期是 2017 年 1 月 12 日,而 DF_2 中最近的旧日期是 05-01-2017,因为 15 和 18 都大于 DF_1 日期。

所需输出:

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

【问题讨论】:

  • 为什么Count == 7ID == 1
  • 请详细说明:"... with most recent past date in DF_2 as compare ..."

标签: r dataframe dplyr tidyr


【解决方案1】:

以下重现了您的预期输出:

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分组,只保留正时间差最小的行,除非所有时间差都是负的,这种情况下报告最小的绝对时差。

【讨论】:

  • 我想从最近旧日期的日期减去 DF_1 的日期,该日期应该是 DF_1 的日期&lt;=。 (例如,对于ID=1,DF_1 的日期是 12-01-2017,而 DF_2 中的最新旧日期是 05-01-2017,因为 15 和 18 都是 &gt;,而不是 DF_1 日期。
  • @Roy1245 这一点都不清楚。 ID == 3 没有"最近的旧日期";那为什么Count == -4 在最后一行?这个条目不应该是NA 或类似的吗?
  • 因为 ID=3 没有日期
  • @Roy1245 这正是我的观点;所以你的规则“最近的旧日期”应该给ID==3一个NA,不是吗?
  • 可以的。
【解决方案2】:

我认为你的最后一行是错误的,因为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    

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2020-03-22
    • 2017-03-27
    相关资源
    最近更新 更多