我有如下数据:
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/