【发布时间】:2018-05-12 21:16:09
【问题描述】:
想知道你们是否有更有效或更优雅的方式将事件日志转换为时间序列。
不要那么以 tidyverse 为中心,但好奇你是否有一个很好的 tidyverse 方法头脑?我试图利用 dplyr::mutate 的滞后函数在值为 NA 时进行观察,但我似乎无法重复滞后。
这是一个简单的例子
library(dplyr)
set.seed(1)
events <- tibble(
t = runif(10, 0, 100) %>% sort(),
value = runif(10, 0, 1)
)
events
# A tibble: 10 x 2
t value
<dbl> <dbl>
1 6.178627 0.2059746
2 20.168193 0.1765568
3 26.550866 0.6870228
4 37.212390 0.3841037
5 57.285336 0.7698414
6 62.911404 0.4976992
7 66.079779 0.7176185
8 89.838968 0.9919061
9 90.820779 0.3800352
10 94.467527 0.7774452
这是执行此操作的一种超级 hacky 方法。 时间序列的事件:
accordian <- function(events_data, freq = 1){
t_seq = seq(
from = min(events_data$t)-freq %>% round(0),
to = max(events_data$t) + freq,
by = freq)
timeseries = tibble(
t = t_seq,
value = NA
)
timeseries = bind_rows(
events_data,
timeseries
) %>%
arrange(t)
for (i in 2:length(timeseries$value)){
if (is.na(timeseries$value[i])){ timeseries$value[i] = timeseries$value[i-1] }
}
timeseries = timeseries %>%
filter(t %in% t_seq)
return(timeseries)
}
accordian(events)
# A tibble: 102 x 3
t value type
<dbl> <dbl> <chr>
1 6.178627 0.2059746 events log
2 20.168193 0.1765568 events log
3 26.550866 0.6870228 events log
4 37.212390 0.3841037 events log
5 57.285336 0.7698414 events log
6 62.911404 0.4976992 events log
7 66.079779 0.7176185 events log
8 89.838968 0.9919061 events log
9 90.820779 0.3800352 events log
10 94.467527 0.7774452 events log
# ... with 92 more rows
并根据事件日志明确区分事件日志和时间序列:
library(ggplot2)
bind_rows(
events %>%
mutate(type = "events log"),
accordian(events) %>%
mutate(type = "time series"),
) %>%
ggplot(
aes(x = t, y = value, color = type)
) +
geom_line()
我很想听听你的建议!
【问题讨论】:
-
我现在面临同样的问题。你最终找到了一个很好的方法来做到这一点吗?我尝试在我的异步事件日志中使用您问题中的代码,但出现了一些问题,可能是因为我的时间变量是 DateTime 格式。
-
嗯,也许我们应该一起做一个包?
-
是的,我也在使用 DateTime 变量,但不想在简单示例中添加额外的层。我会在一周左右发布我的——仍然不是很好——的解决方案。
-
我不知道我是否知道如何制作这样的包裹,但我们可以试试。我在基本 R 中创建了一个异步到同步的函数,它似乎可以工作,也许我们可以将其转换为一个 tidyverse 解决方案?
标签: r asynchronous time-series