【问题标题】:R: dataframe Selecting the maximum row per ID based on first timestampR:数据框根据第一个时间戳选择每个ID的最大行
【发布时间】:2015-05-25 21:04:03
【问题描述】:

我有一个数据框,其中包含带有时间戳的记录。 下面的玩具示例包含一个 ID,它基于两个不同的时间戳附加了 2 个 SMS。实际上会有数千个 ID,每个 ID 都有近 80-100 个短信类型和日期

toydf <- data.frame(ID = c(1045937900, 1045937900), 
                    SMS.Type = c("DF1", "WCB14"), 
                    SMS.Date = c("12/02/2015 19:51", "13/02/2015 08:38"))

我希望能够创建一个新的数据帧,它只包含第一个 SMS.Date 甚至最后一个 SMS 类型的记录

我看过使用duplicated,我还考虑过按每个 ID 降序对日期列进行排序,并添加一个新列,该列在 ID 的第一个实例旁边放置一个 1,如果当前 ID 等于前一个 ID。如果记录数量急剧增加,我怀疑这会变得很重

有谁知道这样做的更优雅的方式 - 也许使用 data.table

感谢您的宝贵时间

【问题讨论】:

    标签: r distinct-values


    【解决方案1】:

    试试

    library(dplyr)
    toydf %>% 
       group_by(ID) %>%
       arrange(desc(as.POSIXct(SMS.Date, format='%d/%m/%Y %H:%M'))) %>% 
       slice(1L)
    

    或使用data.table

    library(data.table)
    toydf$SMS.Date <- as.POSIXct(toydf$SMS.Date, format='%d/%m/%Y %H:%M')
    setkey(setDT(toydf), ID, SMS.Date)[, .SD[.N], ID]
    

    【讨论】:

    • 感谢@akrun 的帮助
    • @JohnSmith 很高兴知道它有帮助。使用.I 和data.table 会更快一些。发布至少 6-10 行用于测试目的总是好的
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多