将相似的时间组合在一起

时间:2021-01-30 01:24:49

标签: r datetime grouping

我有一个包含收缩压和日期/时间的数据框。读数有时是在几分钟内读取的,有时不是。示例如下:

library(tidyverse)

date_time <- c("Jan 29 2020 13:46:08" , 
              "Jan 29 2020 13:42:53" , 
              "Jan 29 2020 12:13:27" ,
              "Jan 29 2020 12:11:19" , 
              "Jan 29 2020 12:09:21" , 
              "Jan 28 2020 12:22:26" , 
              "Jan 27 2020 8:22:20")

systol <- c(132  , 132  , 118  , 115  , 110 , 148 , 120)

df <- data.frame(date_time , systol) %>%
  mutate(dtetime = lubridate::mdy_hms(date_time)

我想将在时间上彼此接近的收缩压读数分组——任意地,最后一个读数在任何组中第一次读数的 10 分钟内进行——并平均读数(最好是平均日期/时间的阅读以及)。我已经尝试通过使用滞后和超前函数然后 group_by 来思考它,如果一个组中没有 2 个读数,则无法设计出一种方法来做到这一点。我对 tidyverse 最熟悉,所以更喜欢这种方法,但我对这样做的任何方式都感兴趣。我对 R 比较陌生。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这是一种使用 data.table 的方法:

library(data.table)
dt <- as.data.table(df)

> dt[, .(mean_value = mean(systol)), by = .(mean_time = lubridate::round_date(x = dtetime, unit = '10 min'))]
             mean_time mean_value
1: 2020-01-29 13:50:00   132.0000
2: 2020-01-29 13:40:00   132.0000
3: 2020-01-29 12:10:00   114.3333
4: 2020-01-28 12:20:00   148.0000
5: 2020-01-27 08:20:00   120.0000

我使用的是 round_date,顾名思义,它会将时间四舍五入到最接近的 10 分钟,您也可以查看 floor_date 或其他选项以获得所需的输出。

答案 1 :(得分:0)

基本上使用 cutorder不断阅读读数后,制作与第一次读数的差异向量,

d <- d[order(d$dtetime), ]  ## order readings increasingly
dff <- with(d, as.numeric(dtetime) - as.numeric(dtetime)[1])  ## calc. diff from 1st reading

允许创建 10 分钟的 bin(以秒为单位)。

bins <- seq(min(dff), max(dff)*1.24, 10 * 60)  ## 10 min bins

现在我们可以cut在这些垃圾箱中分组并计算mean的时间和收缩压,同时aggregate沿着它们移动。

d$group <- cut(dff, breaks=bins, include.lowest=TRUE)
res <- aggregate(cbind(dtetime, systol) ~ group, d, mean)[-1]
res$dtetime <- as.POSIXct(res$dtetime, origin="1970-01-01")  ## converting back to POSIX 
res
#               dtetime systol
# 1 2020-01-27 08:22:20  120.0
# 2 2020-01-28 12:22:26  148.0
# 3 2020-01-29 12:10:20  112.5
# 4 2020-01-29 12:13:27  118.0
# 5 2020-01-29 13:44:30  132.0

数据:

date_time <- c("Jan 29 2020 13:46:08", "Jan 29 2020 13:42:53", "Jan 29 2020 12:13:27", 
               "Jan 29 2020 12:11:19", "Jan 29 2020 12:09:21", "Jan 28 2020 12:22:26", 
               "Jan 27 2020 8:22:20")
systol <- c(132, 132, 118, 115, 110, 148, 120)
d <- data.frame(dtetime=strptime(date_time, format="%b %e %Y %H:%M:%S") , systol)
相关问题