按包括时间在内的多个变量聚合

问题描述 投票:0回答:1

我是 R 编程的新手(就此而言,完全是编程......)我正在尝试为我的班级项目做一些数据分析。我有一些看起来像这样的数据:

身份证 时间 心率
1341231 2016-04-12 07:23:30 95
1341231 2016-04-12 07:23:40 101
1341231 2016-04-12 07:23:50 92
1341231 2016-04-12 07:24:00 87
2342383 2016-04-12 07:23:30 60

这是来自可穿戴健身追踪器的数据,以 5 或 10 秒为间隔。这是一个相当大的数据集,有超过 200 万个条目。我想做的是:对于每个 Id(也就是每个用户),按小时汇总秒数据,返回每小时的平均心率。所以我想要看起来像这样的输出:

身份证 时间 心率
1341231 2016-04-12 07:00 95
1341231 2016-04-12 08:00 82
1341231 2016-04-12 09:00 80
1341231 2016-04-12 10:00 100
2342383 2016-04-12 07:00 65

日期最初是字符串,所以我用

lubridate.
解析它们但是在那之后,事情开始出错了。

所以,我转向我最好的技术:复制粘贴半理解的代码。

首先,我试过

test_df <- aggregate(Heartrate ~ format(as.POSIXct(sechr$Time), "%m-%d-%y %H"), data=sechr, mean)

但这不好。正如我很快意识到的那样,这完全放弃了 Id,以一种或多或少无用的方式总结了我的数据。

所以,接下来我尝试了

aggregate
的各种公式,它似乎没有为另一个变量接受另一个参数,然后用
summarize
group_by
进行了实验,如下所示:

testdf3 <- sechr %>% group_by(c(Time ~ format(as.POSIXct(sechr$Time))), "%m-%d-%y %H", Id) %>% summarise(avg_hr=sum(Heartrate))

不用说了,基本上靠猜根本就不行。我产生了很多错误和几个愚蠢的、无用的数据帧。

基本上,我需要的是一种“对于每个不同的 Id,给我每小时的平均值”的方法。我认为使用

xts
是要走的路吗?或许?但我对如何做我想做的事情感到困惑。

r datetime dplyr xts
1个回答
0
投票

你的group_by() %>% summarize()尝试并没有

太远;我稍微清理了一下,并使用
format()
.
lubridate::tz()

中指定了时区
library(dplyr)
library(lubridate)

sechr %>% 
  group_by(Id, Time = format(Time, "%m-%d-%y %H", tz = tz(Time))) %>%
  summarise(avg_hr = mean(Heartrate)) %>%
  ungroup()
# A tibble: 2 × 3
       Id Time        avg_hr
    <dbl> <chr>        <dbl>
1 1341231 04-12-16 07   93.8
2 2342383 04-12-16 07   60  

如果您想将

format()
保留为日期时间对象,则
Time
的替代方法是使用
lubridate::floor_date()
向下舍入到小时。

sechr %>% 
  group_by(Id, Time = floor_date(Time, "hour")) %>%
  summarise(avg_hr = mean(Heartrate)) %>%
  ungroup()
# A tibble: 2 × 3
       Id Time                avg_hr
    <dbl> <dttm>               <dbl>
1 1341231 2016-04-12 07:00:00   93.8
2 2342383 2016-04-12 07:00:00   60 
© www.soinside.com 2019 - 2024. All rights reserved.