r - "Spread"na.locf数据为不规则时间数据

标签 r dataframe dplyr time-series zoo

我有如下数据:

data <- tibble(time = c(ymd_hms("2019-11-01 09:33:00"),
                        ymd_hms("2019-11-01 09:35:00"),
                        ymd_hms("2019-11-01 09:40:00"),
                        ymd_hms("2019-11-01 09:52:00")),
               data = c(1250, 900, 4000, 9000))
data
##  A tibble: 4 x 2
#   time                 data
#   <dttm>              <dbl>
# 1 2019-11-01 09:33:00  1250
# 2 2019-11-01 09:35:00   900
# 3 2019-11-01 09:40:00  4000
# 4 2019-11-01 09:52:00  9000

我希望在第一个和最后一个观察之间的每一分钟对 data 列进行重新采样,并且我希望 data 的值成为除以的下一个非 NAN 值1 + 从先前的非 nan 值到下一个非 nan 值的 nan 值的数量(即 data 的值从其给定的样本点“传播”回先前给定的样本点)样本点)。

例如,在这种情况下,我期望以下内容

> result
# A tibble: 20 x 2
   time                 data
   <dttm>              <dbl>
 1 2019-11-01 09:33:00  1250
 2 2019-11-01 09:34:00   450
 3 2019-11-01 09:35:00   450
 4 2019-11-01 09:36:00   800
 5 2019-11-01 09:37:00   800
 6 2019-11-01 09:38:00   800
 7 2019-11-01 09:39:00   800
 8 2019-11-01 09:40:00   800
 9 2019-11-01 09:41:00   750
10 2019-11-01 09:42:00   750
11 2019-11-01 09:43:00   750
12 2019-11-01 09:44:00   750
13 2019-11-01 09:45:00   750
14 2019-11-01 09:46:00   750
15 2019-11-01 09:47:00   750
16 2019-11-01 09:48:00   750
17 2019-11-01 09:49:00   750
18 2019-11-01 09:50:00   750
19 2019-11-01 09:51:00   750
20 2019-11-01 09:52:00   750

我该怎么做?


我在Zoo看到如何使用na.locf几乎可以做到我想要的,但我不知道如何合并数据的这种“传播”,而不是仅仅填充最后一个值或进行线性插值。

我还尝试使用 xts 并将两个系列(其中一个是不规则日期)与一些自定义逻辑合并,但这对我来说是具有挑战性的。

最佳答案

我们可以使用dplyr并将数据框与具有所有时间步长的数据框连接

然后我们可以使用 tidyr 向上填充,最后除以每组中的记录数(即缺失的时间步数 + 1)

library(dplyr)
library(lubridate)
library(tidyr)
data <- tibble(time = c(ymd_hms("2019-11-01 09:33:00"),
                        ymd_hms("2019-11-01 09:35:00"),
                        ymd_hms("2019-11-01 09:40:00"),
                        ymd_hms("2019-11-01 09:52:00")),
               data = c(1250, 900, 4000, 9000))
tibble(time = seq.POSIXt(from = min(data$time),
                         to = max(data$time), by="min")) %>%
  left_join(., data, by="time") %>% 
  group_by(id = cumsum(is.na(data) & !is.na(lag(data)))) %>% 
  fill(data, .direction = "up") %>% 
  mutate(data = data/ n())
#> # A tibble: 20 x 3
#> # Groups:   id [4]
#>    time                 data    id
#>    <dttm>              <dbl> <int>
#>  1 2019-11-01 09:33:00  1250     0
#>  2 2019-11-01 09:34:00   450     1
#>  3 2019-11-01 09:35:00   450     1
#>  4 2019-11-01 09:36:00   800     2
#>  5 2019-11-01 09:37:00   800     2
#>  6 2019-11-01 09:38:00   800     2
#>  7 2019-11-01 09:39:00   800     2
#>  8 2019-11-01 09:40:00   800     2
#>  9 2019-11-01 09:41:00   750     3
#> 10 2019-11-01 09:42:00   750     3
#> 11 2019-11-01 09:43:00   750     3
#> 12 2019-11-01 09:44:00   750     3
#> 13 2019-11-01 09:45:00   750     3
#> 14 2019-11-01 09:46:00   750     3
#> 15 2019-11-01 09:47:00   750     3
#> 16 2019-11-01 09:48:00   750     3
#> 17 2019-11-01 09:49:00   750     3
#> 18 2019-11-01 09:50:00   750     3
#> 19 2019-11-01 09:51:00   750     3
#> 20 2019-11-01 09:52:00   750     3

关于r - "Spread"na.locf数据为不规则时间数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59185678/

相关文章:

r - 如何使用 golem 在 Flexdashboard 包装器中制作 dockerized Shiny 应用程序?

r - 将 data.frame 列名称传递给使用 purrr::map 的函数

r - Markdown 报告未在 Rstudio 中执行

python - DataFrame.ne 当比较的数据是 None 类型时返回 false

r - R中基于多个范围的连接表

R:如何使用 dplyr 计算具有缺失值的每一行的平均值

r - dplyr 选择助手的交集

在构面内重新排序分组条形图

python - 将 3D pandas 数据帧转换为 2d

python - 重命名 Panda Series/DataFrame 的索引