我有一个包含 3 列的 data.table:
活动 | 活动 | 时间 |
---|---|---|
吃 | 开始 | 2024-10-31 20:30:00 |
吃 | 结束 | 2024-10-31 21:00:00 |
睡觉 | 开始 | 2024-10-31 21:00:00 |
睡觉 | 结束 | 2024-10-31 22:30:00 |
有一项活动有开始和结束时间,但我希望实际上有一张桌子,上面写满了每一分钟。它应该看起来像:
活动 | 活动 | 时间 |
---|---|---|
吃 | 开始 | 2024-10-31 20:30:00 |
吃 | 不适用 | 2024-10-31 20:31:00 |
吃 | 不适用 | 2024-10-31 20:32:00 |
... | ... | ... |
吃 | 结束 | 2024-10-31 21:00:00 |
睡觉 | 开始 | 2024-10-31 21:00:00 |
睡觉 | 不适用 | 2024-10-31 21:01:00 |
睡觉 | 不适用 | 2024-10-31 21:02:00 |
... | ... | ... |
睡觉 | 结束 | 2024-10-31 22:30:00 |
我不太关心“事件”一栏,但重要的是时间和活动在那里。关于如何解决这个问题有什么想法吗?
假设活动始终按顺序进行,您可以执行以下操作:
# toy data
dt <- data.table::data.table(
activity = c(
"eat",
"eat",
"sleep",
"sleep",
"eat",
"eat",
"sleep",
"sleep"
),
time = c(
lubridate::ymd_hm("2024-10-31 20:30"),
lubridate::ymd_hm("2024-10-31 21:00"),
lubridate::ymd_hm("2024-10-31 21:00"),
lubridate::ymd_hm("2024-10-31 22:30"),
lubridate::ymd_hm("2024-10-31 22:30"),
lubridate::ymd_hm("2024-10-31 23:00"),
lubridate::ymd_hm("2024-10-31 23:00"),
lubridate::ymd_hm("2024-10-31 24:00")
)
)
# rolling id on the activity
dt[, group := data.table::rleid(activity)]
# function to sequence by minut
f <- function(x) {
seq(min(x), max(x), by = "min")
}
# run the function
dt[, .(time = f(time)), by = .(activity, group)]
结果是:
activity group time
<char> <int> <POSc>
1: eat 1 2024-10-31 20:30:00
2: eat 1 2024-10-31 20:31:00
3: eat 1 2024-10-31 20:32:00
4: eat 1 2024-10-31 20:33:00
5: eat 1 2024-10-31 20:34:00
---
210: sleep 4 2024-10-31 23:56:00
211: sleep 4 2024-10-31 23:57:00
212: sleep 4 2024-10-31 23:58:00
213: sleep 4 2024-10-31 23:59:00
214: sleep 4 2024-11-01 00:00:00
rleid()
是一个滚动ID,以确保即使活动相同,您也不希望连接从昨天吃饭到今天的时间。
希望这有帮助!