x在两个日期之间吗?

时间:2019-07-19 14:11:52

标签: r date dataframe

我在同一项目范围pandas dataframe groupby datetime month中还有另一个问题,但是我担心数据结构可能很复杂,因此我正在尝试另一种方法。我希望这能达到相同的结果。

理想情况下,我希望将电话号码矩阵构建为行,将开始日期和结束日期构建为列,并确定拨打电话的时间段。

这将通过将日期和电话号码的数据集转换为完整的日期列表,确定结束日期匹配,然后查看拨打电话的日期是否在该时间段内来实现。

原始数据如下:

    Date = as.Date(c("2019-03-01", "2019-03-15","2019-03-29",      "2019-04-10","2019-03-05","2019-03-20"))
    Phone =   c("070000001","070000001","070000001","070000001","070000002","070000002")
    df<-data.frame(Date,Phone)

    df

    ##         Date     Phone
    ## 1 2019-03-01 070000001
    ## 2 2019-03-15 070000001
    ## 3 2019-03-29 070000001
    ## 4 2019-04-10 070000001
    ## 5 2019-03-05 070000002
    ## 6 2019-03-20 070000002

理想情况下,我希望它看起来像这样:

    ##         Date     Phone INT_1 INT_2 INT_3 INT_4 INT_5
    ## 1 2019-03-01 070000001     X     X     X     X     X
    ## 2 2019-03-15 070000002                 X     X     X

INT是一系列日期+ 30,而X表示该电话号码出现在该滚动期内。

为此,我假设您需要两个数据集。上面的一个是按日期拨打的电话号码,第二个是日期的完整列表及其= 30天的计数器。

    dates<-as.data.frame(seq(as.Date("2016/7/1"), as.Date("2019/7/1"),"days"), 
    responseName = c('start'))

    dates$end<-dates$start+30

    ## INT       start        end
    ##   1 2016-07-01 2016-07-31
    ##   2 2016-07-02 2016-08-01
    ##   3 2016-07-03 2016-08-02
    ##   4 2016-07-04 2016-08-03

但是我如何让两者一起评估呢?我假设某种电话数据的合并和扩展到日期列表中,然后通过行索引/ INT散布日期?

1 个答案:

答案 0 :(得分:0)

我认为要匹配两个数据帧,可以使用fuzzyjoin。例如,如果我将电话号码和使用日期的数据框定义为:

library(dplyr)
library(fuzzyjoin)
fake_phone_data <- tibble(
  date = as.Date(c("2019-01-03", "2019-01-27", "2019-02-12", "2019-02-25", "2019-02-26")), 
  phone = c("1", "1", "2", "2", "2")
)

和开始/结束日期的数据框(加上ID列)为:

id_dates <- tibble(
  ID = c("1", "2", "3", "4"), 
  starting_date = as.Date(c("2019-01-01", "2019-01-16", "2019-02-01", "2019-02-16")), 
  ending_date = as.Date(c("2019-01-15", "2019-01-31", "2019-02-15", "2019-02-27"))
)

然后我可以使用Fuzzyjoin连接两个数据帧,即,如果电话的日期发生在相应时段的开始日期和结束日期之间,则匹配两行:

fuzzy_left_join(
  fake_phone_data, 
  id_dates, 
  by = c(
    "date" = "starting_date", 
    "date" = "ending_date"
  ),
  match_fun = list(`>=`, `<`)
)
#> # A tibble: 5 x 5
#>   date       phone ID    starting_date ending_date
#>   <date>     <chr> <chr> <date>        <date>     
#> 1 2019-01-03 1     1     2019-01-01    2019-01-15 
#> 2 2019-01-27 1     2     2019-01-16    2019-01-31 
#> 3 2019-02-12 2     3     2019-02-01    2019-02-15 
#> 4 2019-02-25 2     4     2019-02-16    2019-02-27 
#> 5 2019-02-26 2     4     2019-02-16    2019-02-27

reprex package(v0.3.0)于2019-07-19创建

它可以解决您的问题吗?

此方法与this question非常相似。