【问题标题】:How to remove duplicate records based off a date/time timestamp column using tidyverse? R如何使用 tidyverse 删除基于日期/时间时间戳列的重复记录? R
【发布时间】:2022-01-12 20:47:01
【问题描述】:

我有一个看起来像这样的数据集。

library(tidyverse)

data <- structure(list(Timestamp = c("12/7/2021 11:29:15", "12/7/2021 11:29:35", 
                                     "12/7/2021 11:59:18", "12/7/2021 12:28:53", 
                                     "12/7/2021 13:19:12"), 
                        ID = c(157767, 380925, 319956, 375889, 375889), 
                        Status = c("Yes", "No", "Yes", "No", "Yes")), 
                        row.names = c(NA, -5L), class = c("tbl_df",                                                                                             
                        "tbl", "data.frame"))

print(data)
> data
# A tibble: 5 x 3
  Timestamp              ID Status
  <chr>               <dbl> <chr> 
1 12/7/2021 11:29:15 157767 Yes   
2 12/7/2021 11:29:35 380925 No    
3 12/7/2021 11:59:18 319956 Yes   
4 12/7/2021 12:28:53 375889 No    
5 12/7/2021 13:19:12 375889 Yes  

第 4 行和第 5 行具有相同的 ID。根据时间戳,我可以看到第 5 行是稍后完成的,并且状态已更新。

我是否可以根据时间戳进行过滤以仅显示数据框中的最新时间戳?我想要的输出如下

  Timestamp              ID Status
  <chr>               <dbl> <chr> 
1 12/7/2021 11:29:15 157767 Yes   
2 12/7/2021 11:29:35 380925 No    
3 12/7/2021 11:59:18 319956 Yes      
4 12/7/2021 13:19:12 375889 Yes 

谢谢。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    使用dplyr::slice_max,您可以这样做:

    注意:由于您的 Timestamp 是一个角色,我们首先必须将其转换为日期时间才能使其正常工作(感谢 @utubun 在他的评论中指出这一点)

    library(dplyr)
    
    data %>% 
      group_by(ID) %>% 
      slice_max(as.POSIXct(Timestamp, format = "%d/%m/%Y %H:%M:%S")) %>% 
      ungroup() %>% 
      arrange(Timestamp)
    #> # A tibble: 4 × 3
    #>   Timestamp              ID Status
    #>   <chr>               <dbl> <chr> 
    #> 1 12/7/2021 11:29:15 157767 Yes   
    #> 2 12/7/2021 11:29:35 380925 No    
    #> 3 12/7/2021 11:59:18 319956 Yes   
    #> 4 12/7/2021 13:19:12 375889 Yes
    

    【讨论】:

    • 如果不转换为日期,则不会保存,例如max(c('12/7/2021 13:19:12', '12/10/2021 13:09:12')) 结果为 "12/7/2021 13:19:12",因为字符是按字母顺序排列的。
    • @utubun。谢谢。还没有意识到 Timestamp 已经不是日期时间。会解决的。
    【解决方案2】:
    1. 首先将Timestamp 转换为dttm 类。
    2. last()分组和过滤
    library(dplyr)
    library(lubridate)
    data %>% 
      mutate(Timestamp = dmy_hms(Timestamp)) %>% 
      group_by(ID) %>% 
      filter(Timestamp == last(Timestamp))
    
      Timestamp               ID Status
      <dttm>               <dbl> <chr> 
    1 2021-07-12 11:29:15 157767 Yes   
    2 2021-07-12 11:29:35 380925 No    
    3 2021-07-12 11:59:18 319956 Yes   
    4 2021-07-12 13:19:12 375889 Yes 
    ``´
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 2018-02-07
      • 1970-01-01
      • 2015-05-21
      • 2011-09-07
      • 1970-01-01
      • 2021-10-21
      • 2020-07-19
      相关资源
      最近更新 更多