首页 > 解决方案 > 如何根据时间戳获取每个 ID 的最新行

问题描述

我需要每个组具有最新时间值的行。我有多个行和列。输入数据如下所示:

view(DF)

ID  Value1  Value2  Value3  Value4  Time
1   1   7   13  19  2013-11-15 21:12:03:337
1   2   8   14  20  2013-12-23 15:12:01:227
2   3   9   15  21  2014-12-07 14:37:01:127
2   4   10  16  22  2013-12-12 05:23:01:239
3   5   11  17  23  2011-12-25 15:12:01:227
3   6   12  18  24  2011-12-25 15:12:02:227

我需要这样的结果:

ID  Value1  Value2  Value3  Value4  Time
1   2   8   14  20  2013-12-23 15:12:01:227
2   3   9   15  21  2014-12-07 14:37:01:127
3   6   12  18  24  2011-12-25 15:12:02:227

我已经查看了 community.rstudio.com/t/replacing-all-null-values-in-a-dataset-code-issue/11285 上提供的解决方案

我试过了

DF_filter = DF%>% 
  group_by(ID) %>%
  slice(which.max(Time))

另外,我尝试将时间戳中的时间列转换为

DF_time <- strptime(x=as.character(DF$Time), format = "%y-%m-%d %H%M:S")

但是 DF_time 正在返回NA

第一个代码返回一个DF_filter具有 0 obs 的数据 ()。和 6 个变量。请帮忙。

标签: rdate

解决方案


一种data.table方法

样本数据

DT <- fread('ID  Value1  Value2  Value3  Value4  Time
1   1   7   13  19  "2013-11-15 21:12:03:337"
            1   2   8   14  20  "2013-12-23 15:12:01:227"
            2   3   9   15  21  "2014-12-07 14:37:01:127"
            2   4   10  16  22  "2013-12-12 05:23:01:239"
            3   5   11  17  23  "2011-12-25 15:12:01:227"
            3   6   12  18  24  "2011-12-25 15:12:02:227"', quote = "\"")

代码

#first, set miliseconds correct by replacing the last : with a .
DT[, Time := gsub( "(.*)(:)([0-9]*$)", "\\1.\\3", Time)]
#now convert to POSIXct
DT[, Time := as.POSIXct( Time, format = " %Y-%m-%d %H:%M:%OS")]

#now, pull the max Time per group
DT[DT[, .I[which.max(Time)], by=ID]$V1]

输出

#    ID Value1 Value2 Value3 Value4                Time
# 1:  1      2      8     14     20 2013-12-23 15:12:01
# 2:  2      3      9     15     21 2014-12-07 14:37:01
# 3:  3      6     12     18     24 2011-12-25 15:12:02

推荐阅读