我有一些数据,显示在几天的时间内每天每一分钟几秒钟后所测量的某些事物的数值。这是三天两分钟的示例:
sub foo ( Str ){}
sub bar ( Int ){}
foo <1>;
bar <1>;
foo 1; # Failure
bar '1'; # Failure
对于该数据,我想计算整天中每分钟的平均值。对于上述示例数据,结果将如下所示:
dat <- read.table(textConnection('
date_and_time amount
"2020-05-01 13:23:02" 8
"2020-05-01 13:24:06" 26
"2020-05-02 13:23:01" 5
"2020-05-02 13:24:01" 30
"2020-05-03 13:23:03" 6
"2020-05-03 13:24:02" 27
'), header = TRUE, colClasses=c("POSIXct", "numeric"))
要获得该结果,我已将datetime对象转换为字符串,从字符串中去除了日期和秒数,将字符串转换为一个因子,并计算了每个因子的均值。
是否可以通过datetime对象获得该结果?就是说,是否有一个函数可以在不同日期的同一时间计算均值?
答案 0 :(得分:2)
如果按日期时间表示POSIXct,则该类不能表示没有日期的时间;但是,计时时间类可以。
以下内容将日期/时间转换为时间对象ch
,然后将其转换为时间对象time_of_day
,并将其截断为分钟。最后,我们以此汇总amount
。
library(chron)
ch <- as.chron(format(dat$date_and_time))
time_of_day <- trunc(ch - dates(ch), "min")
ag <- aggregate(amount ~ time_of_day, dat, mean)
给予:
> ag
time_of_day amount
1 13:23:00 6.333333
2 13:24:00 27.666667
> str(ag)
'data.frame': 2 obs. of 2 variables:
$ time_of_day: 'times' num 13:23:00 13:24:00
..- attr(*, "format")= chr "h:m:s"
$ amount : num 6.33 27.67
答案 1 :(得分:1)
在Base-R
sapply(split(dat$amount,format(dat$date_and_time, format='%H:%M')), mean)
13:23 13:24
6.333333 27.666667
我使用了format
函数来去除日期和秒数。您也可以使用其他方法来计算平均值。
答案 2 :(得分:1)
您的问题的答案是否定的。类POSIXct
的对象必须具有日期。
这是使用lubridate
和dplyr
的方法:
library(dplyr)
library(lubridate)
dat %>%
mutate(hour = hour(date_and_time),
minute = minute(date_and_time)) %>%
group_by(hour,minute) %>%
dplyr::summarise(mean_amount = mean(amount))
# hour minute mean_amount
# <int> <int> <dbl>
#1 13 23 6.33
#2 13 24 27.7
答案 3 :(得分:1)
其他解决方案
library(tidyverse)
library(lubridate)
library(hms)
dat %>%
mutate(time = floor_date(x = date_and_time, unit = "min") %>% hms::as_hms()) %>%
group_by(time) %>%
summarise(mean_amount = mean(amount))