我有一个包含收缩压和日期/时间的数据框。读数有时是在几分钟内读取的,有时不是。示例如下:
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 比较陌生。感谢您的帮助!
答案 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)
基本上使用 cut
。 order
不断阅读读数后,制作与第一次读数的差异向量,
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)