gpt4 book ai didi

r - 按时间间隔对值求和的优雅方式(同时考虑缺失值)

转载 作者:行者123 更新时间:2023-12-05 06:35:11 26 4
gpt4 key购买 nike

我正在尝试做这样的事情

df <- data.frame(times = c("0915", "0930", "0945", "1000", "1015", "1030", "1045", "1100", "1130", "1145", "1200"),
values = c(1,2,3,4,1,2,3,4,1,3,4))

> df
times values
1 0915 1
2 0930 2
3 0945 3
4 1000 4
5 1015 1
6 1030 2
7 1045 3
8 1100 4
9 1130 1
10 1145 3
11 1200 4
12 1215 1
13 1245 3
14 1300 4
15 1330 2
16 1345 4

然后把它变成这样

> df2
times values
1 0930 3
2 1000 7
3 1030 3
4 1100 7
5 1130 NA
6 1200 7
7 1230 NA
8 1300 7
9 1330 NA
10 1400 NA

基本上,获取以 15 分钟为间隔测量的值,并将它们转换为以 30 分钟为间隔测量的值(求和就足够了)。

如果我能确定我每半小时阅读一次,我有两个 15 分钟的阅读时间,我就能想出一个不错的解决方案。我可以成对地添加元素并得到我想要的。但我无法在我的数据集中确定这一点。正如我的演示还显示的那样,可能缺少多个连续的值。

所以我认为某种数字识别是必要的,例如识别出时间在 9:15 到 9:30 之间,然后将这两者相加。所以我已经创建了一个名为 hr2dec 的函数来将这些时间转换为十进制,所以它看起来像这样

> hr2dec(df$times)
[1] 9.25 9.50 9.75 10.00 10.25 10.50 10.75 11.00 11.50 11.75 12.00

我提到这一点是为了防止用小数而不是 4 位时间更容易解决这个问题。

我也有 24 小时和多天的数据。因此,如果我有一个循环解决方案,它需要在 2400 之后重置为 0015,因为这些是每天的第一个和最后一个测量值。可以像这样生成包含日期的完整数据集(时间带有小数点,就像我说的那样,对我来说都可以):

set.seed(42)
full_df <- data.frame(date = rep(as.Date(c("2010-02-02", "2010-02-03")), each = 96),
dec_times = seq(0.25,24,0.25),
values = rnorm(96)
)

full_df <- full_df[-c(2,13,15,19,95,131,192),]

到目前为止,我能想到的最佳解决方案是成对比较循环。但即使这样也不是完美的。

是否有一些优雅的方式来完成我想要的事情? IE。检查第一个和最后一个值(根据日期和时间),然后每半小时求和一次?我对我的循环不满意...

  1. 检查第一个和最后一个日期时间值以确定半小时的范围
  2. 按顺序检查项目,一次配对,以确定我是否有两个属于该半小时时段的值。
  3. 如果我做,则求和,如果我不做,则放置 NA。

最佳答案

您应该查看 tibbletime package -- 具体来说,您需要查看 collapse_by(),它按时间段折叠 tbl_time 对象。

library(tibbletime)
library(dplyr)

# create a series of 7 days
# 2018-01-01 to 2018-01-07 by 15 minute intervals
df <- create_series('2018-01-01' ~ '2018-01-07', period = "15 minute")
df$values <- rnorm(nrow(df))
df
#> # A time tibble: 672 x 2
#> # Index: date
#> date values
#> <dttm> <dbl>
#> 1 2018-01-01 00:00:00 -0.365
#> 2 2018-01-01 00:15:00 -0.275
#> 3 2018-01-01 00:30:00 -1.50
#> 4 2018-01-01 00:45:00 -1.64
#> 5 2018-01-01 01:00:00 -0.341
#> 6 2018-01-01 01:15:00 -1.05
#> 7 2018-01-01 01:30:00 -0.544
#> 8 2018-01-01 01:45:00 -1.10
#> 9 2018-01-01 02:00:00 0.0824
#> 10 2018-01-01 02:15:00 0.477
#> # ... with 662 more rows

# Collapse into 30 minute intervals, group, and sum
df %>%
collapse_by("30 minute") %>%
group_by(date) %>%
summarise(sum_values = sum(values))
#> # A time tibble: 336 x 2
#> # Index: date
#> date sum_values
#> <dttm> <dbl>
#> 1 2018-01-01 00:15:00 -0.640
#> 2 2018-01-01 00:45:00 -3.14
#> 3 2018-01-01 01:15:00 -1.39
#> 4 2018-01-01 01:45:00 -1.64
#> 5 2018-01-01 02:15:00 0.559
#> 6 2018-01-01 02:45:00 0.581
#> 7 2018-01-01 03:15:00 -1.50
#> 8 2018-01-01 03:45:00 1.36
#> 9 2018-01-01 04:15:00 0.872
#> 10 2018-01-01 04:45:00 -0.835
#> # ... with 326 more rows

# Alternatively, you can use clean = TRUE
df %>%
collapse_by("30 minute", clean = TRUE) %>%
group_by(date) %>%
summarise(sum_values = sum(values))
#> # A time tibble: 336 x 2
#> # Index: date
#> date sum_values
#> <dttm> <dbl>
#> 1 2018-01-01 00:30:00 -0.640
#> 2 2018-01-01 01:00:00 -3.14
#> 3 2018-01-01 01:30:00 -1.39
#> 4 2018-01-01 02:00:00 -1.64
#> 5 2018-01-01 02:30:00 0.559
#> 6 2018-01-01 03:00:00 0.581
#> 7 2018-01-01 03:30:00 -1.50
#> 8 2018-01-01 04:00:00 1.36
#> 9 2018-01-01 04:30:00 0.872
#> 10 2018-01-01 05:00:00 -0.835
#> # ... with 326 more rows

如果您更喜欢视频(< 20 分钟),请查看 The Future of Time Series and Financial Analysis in the Tidyverse大卫·沃恩 (David Vaughan)。

关于r - 按时间间隔对值求和的优雅方式(同时考虑缺失值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49807220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com