用行之间的值填充 r data.table 中的 NA

问题描述 投票:0回答:1

我有一个包含 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

我不太关心“事件”一栏,但重要的是时间和活动在那里。关于如何解决这个问题有什么想法吗?

r time-series data.table
1个回答
0
投票

假设活动始终按顺序进行,您可以执行以下操作:

# 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,以确保即使活动相同,您也不希望连接从昨天吃饭到今天的时间。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.