r - 计算进入和退出之间的持续时间 - 代码优化
问题描述
我有一些数据:
- 唯一标识符
- 一个动作(进入或退出)
- 时间戳
- 建筑物 ID 和其他一些列。
我正在尝试根据入口、出口、建筑物 ID 和唯一标识符(车号)计算进入建筑物的时间。
现在,我按唯一 ID 对数据框进行排序,然后按日期排序,然后应用此算法:
For each row {
if row.type = 'entry' and nextRow.type = 'exit' and row.uid = nextRow.uid {
Calculate time difference and add this data to another df.
}
}
尽管我只有 6000 行,但它需要一些时间来运行......我对 R 不是很熟悉,我认为有一些方法可以加速这个......
代码如下:
# Sort rows:
BldActivity <- BldActivity[order(BldActivity$UniqueId, BldActivity$DateOfEvent),]
df = data.frame(NULL)
DurationOfStay <- data.frame(NULL)
for(i in 1:nrow(BldActivity)) {
row <- BldActivity[i,]
# do stuff with row
if(row$Type == 'entry') {
rowNext <- BldActivity[i+1,]
if(!is.na(rowNext$Type)) {
if(rowNext$Type == 'exit' && row$UniqueId == rowNext$UniqueId)
{
newRow <- data.frame( Entry_DateOfEvent = row$DateOfEvent,
Exit_DateOfEvent = rowNext$DateOfEvent,
BuildingID = row$BuildingID,
BuildingName = row$`Building Name`,
UniqueId = row$UniqueId,
DurationOfStay = difftime(rowNext$DateOfEvent, row$DateOfEvent, units="mins")
)
DurationOfStay <- rbind(DurationOfStay,newRow)
}
}
}
}
您能否指出可能的改进?
这是一个输入示例:
DateOfEvent Type UniqueId BuildingID Building Name
2019/03/22 09:15:43 entry 04352e5b6051c311048a5803f8716700 1e98f5c0e699 Building 2
2019/03/22 09:51:45 exit 04352e5b6051c311048a5803f8716700 1e98f5c0e699 Building 2
2019/03/22 10:31:28 entry 066b9a3995acd495318ad70e0d876f00 062e933d6b9f Building 1
2019/03/22 11:15:02 exit 066b9a3995acd495318ad70e0d876f00 062e933d6b9f Building 1
2019/03/22 11:11:42 entry 0e027aba359aaecbe8fe3eaf5a1bbb00 062e933d6b9f Building 1
2019/03/22 14:44:27 exit 0e027aba359aaecbe8fe3eaf5a1bbb00 062e933d6b9f Building 1
2019/03/22 09:55:03 entry 1747dbaef11176b9ab90f2cfbf056210 1e98f5c0e699 Building 2
2019/03/22 18:13:08 exit 1747dbaef11176b9ab90f2cfbf056210 1e98f5c0e699 Building 2
2019/03/21 14:23:53 entry 3e0d2c4b1b159a24f4dc5fa084b59f00 1e98f5c0e699 Building 2
2019/03/21 15:36:31 exit 3e0d2c4b1b159a24f4dc5fa084b59f00 1e98f5c0e699 Building 2
输出只是输入/输出的列值和计算的持续时间。
谢谢
菲利普
解决方案
library(data.table)
setDT(BldActivity)
DurationOfStay <- dcast(BldActivity, UniqueId + BuildingID + `Building Name` ~ Type, value.var = "DateOfEvent")
DurationOfStay[, DurationOfStay := difftime(exit, entry, units="mins"), ]
推荐阅读
- node.js - async.series 中的回调参数是什么?
- javascript - 寻找用于显示和编辑节点和边网络的 Javascript 库
- c# - WPF 动画:我如何让它滑入?
- javascript - 在 JavaScript 中多次单击按钮,多个音频播放(旧声音与新声音重叠)
- java - 为什么我不能将位图调整为 ImageView 的大小?
- python - 定义查询模型时使用的表达式
- javascript - 如何在 TOAST UI 组件图像编辑器中访问画布?
- amazon-web-services - 无法通过 aws cli 从 localstack 调用 lambda 函数
- c++ - 通过宏嵌入代码
- javascript - 必须为 EventListener 按键两次(javascript)