【问题标题】:Two dataframes with identical columns, subset one if column time is within 24 hours in R具有相同列的两个数据框,如果列时间在 R 中的 24 小时内,则为子集
【发布时间】:2020-08-14 23:35:04
【问题描述】:

我有两个具有相同变量标题的数据框,如果一个人的姓名匹配并且他们的订购时间少于 24 小时,我想将 df1 通过 df2 子集。

Name <- c("MCCARTNEY, PAUL", "STARR, RNGO", "HARRISON, GEORGE", "LENNON, JOHN")
Order_TM <-c("3/4/2020 15:16", "3/4/2020 15:16", "3/4/2020 15:16","3/4/2020 19:30")
df1 <-data.frame(Name, Order_TM)

在 df2 中,我的名称相同,但订购时间不同

Name <- c("MCCARTNEY, PAUL", "STARR, RNGO", "HARRISON, GEORGE", "LENNON, JOHN")
Order_TM <-c("3/4/2020 18:16", "3/4/2020 20:16", "3/6/2020 15:16","3/5/2020 12:00")
df2 <-data.frame(Name, Order_TM)

如果 Order_TM 距离 df2 中的 Order_TM 不到 24 小时,我想对 df1 进行子集化。根据我的示例,结果将是 MCCARTNEY、PAUL、STARR、RINGO 和 LENNON、JOHN。但我一直无法找到一种方法来做到这一点。

【问题讨论】:

    标签: r time datatable subset


    【解决方案1】:

    如果您更喜欢dplyr 解决方案,您可以试试这个:

    library(dplyr)
    library(lubridate)
    df1 %>% 
      left_join(df2,by = "Name") %>%
      mutate(Order_TM = Order_TM.x, TimeDiff = mdy_hm(Order_TM.x) - mdy_hm(Order_TM.y)) %>%
      filter(abs(TimeDiff) <= 24) %>%
      dplyr::select(-Order_TM.y,-Order_TM.x)
    #             Name       Order_TM    TimeDiff
    #1 MCCARTNEY, PAUL 3/4/2020 15:16  -3.0 hours
    #2     STARR, RNGO 3/4/2020 15:16  -5.0 hours
    #3    LENNON, JOHN 3/4/2020 19:30 -16.5 hours
    

    【讨论】:

      【解决方案2】:
      # convert data frames to data.tables
      library(data.table)
      setDT(df1)
      setDT(df2)
      
      # convert Order_TM to datetime format
      df1[, Order_TM := as.POSIXct(Order_TM, format = '%m/%d/%Y %R')]
      df2[, Order_TM := as.POSIXct(Order_TM, format = '%m/%d/%Y %R')]
      
      # join to find difference in hours between datetimes
      df1[df2, on = .(Name), time_diff := abs(difftime(i.Order_TM, Order_TM, 'hours'))]
      
      # subset based on time difference
      df1[time_diff < 24]
      #               Name            Order_TM  time_diff
      # 1: MCCARTNEY, PAUL 2020-03-04 15:16:00  3.0 hours
      # 2:     STARR, RNGO 2020-03-04 15:16:00  5.0 hours
      # 3:    LENNON, JOHN 2020-03-04 19:30:00 16.5 hours
      

      【讨论】:

      • 如果名称观察在 df1 中多次出现怎么办,我怎么能得到他们两个的时差?
      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多