r - 如何根据时间戳获取每个 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 个变量。请帮忙。
解决方案
一种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
推荐阅读
- oracle - Oracle APEX 5.1 自定义表单问题
- applescript - 如何使用 AppleScript 在电子邮件回复中添加附件
- debian - 什么是'zookeeper.znode.parent'?
- python - 如何使用 SQLAlchemy ORM 在 Oracle 中获取解释计划
- vba - 使用日期自动填充表格
- node.js - 为什么节点 10 强制在 fs.writeFile() 上传递回调?
- asp-classic - 经典 ASP Server.CreateObject 权限被拒绝
- django - 我可以将 Python 3.7 与 Django 1.11 一起使用吗?
- wordpress - 拆分定期订阅付款(贝宝或其他网关)
- swift - 在 NavigationBar Swift 上设置一次图像