我有一个小时列表,我想计算平均值。列表如下所示:
mydata
dawn dusk
1 7:12 19:14
2 7:10 19:15
3 7:09 19:16
4 7:07 19:17
5 7:06 19:18
6 7:04 19:19
7 7:02 19:20
8 7:01 19:21
我在R中尝试过,但由于对象不是数字或逻辑,所以找不到计算均值的方法。我可以这样计算平均值
mean(as.numeric(mydata$dusk)
但是我不明白结果(57.5)。 我在Excel中尝试过,但无法正常工作。如果我尝试像这样的小样本(mydata)正在工作,但是数据集有500行,而Excel显示了一个奇怪的结果(例如:在黎明时间列表中,所有时间或多或少在05:00 AM到08之间:00 AM,结果是18:30。黄昏时间同样的问题)。我不知道Excel问题是否取决于时区,所以我想在R中解决。 有什么建议吗? 问候, 丽莎
答案 0 :(得分:1)
您可以使用chron
实现这一目标
在您的情况下,您需要消除以下因素:
mydata$dusk <- paste0(as.character(mydata$dusk), ":00")
使用chron::times
mean(chron::times(mydata$dusk))
[1] 19:17:30
或如下
format(mean(strptime(mydata$dusk, "%H:%M:%S")), "%H:%M:%S")
[1] 19:17:30
答案 1 :(得分:0)
您也可以考虑使用lubridate软件包。 hm
函数可以处理小时:分钟格式。 period_to_seconds
和seconds_to_period
可以正确处理时间类别。
library(tidyverse)
library(lubridate)
mydata2 <- mydata %>%
mutate_all(list(~hm(.))) %>%
summarize_all(list(~seconds_to_period(mean(period_to_seconds(.)))))
mydata2
# dawn dusk
# 1 7H 6M 22.5S 19H 17M 30S
数据
mydata <- read.table(text = " dawn dusk
1 '7:12' '19:14'
2 '7:10' '19:15'
3 '7:09' '19:16'
4 '7:07' '19:17'
5 '7:06' '19:18'
6 '7:04' '19:19'
7 '7:02' '19:20'
8 '7:01' '19:21'",
header = TRUE, stringsAsFactors = FALSE)