【问题标题】:How can I count average temperature every hour in many different columns in R如何计算 R 中许多不同列中每小时的平均温度
【发布时间】:2016-05-10 09:34:12
【问题描述】:

我有一个数据框,其中包含 34 个不同系统的日期和温度,每个系统在不同的列中。我需要计算每个系统的平均每小时温度。我使用此代码计算 1 个系统的平均值。但是如果我想计算其他 33 个系统的平均值,我必须一次又一次地重复代码。有没有更好的方法一次找到所有列的小时平均值?

dat$ut_ms <- dat$ut_ms/1000
dat[ ,1]<- as.POSIXct(dat[,1], origin="1970-01-01")
dat$ut_ms <- strptime(dat$ut_ms, "%Y-%m-%d %H:%M")
dat$ut_ms <- cut(dat[enter image description here][1]$ut_ms, breaks = 'hour')
meanNPWD2401<- aggregate(NPWD2401 ~ ut_ms, dat, mean)

我添加了一张数据图片。为了更好地了解我想要什么。

【问题讨论】:

  • 欢迎来到 SO。您能否编辑您的问题并包含dput(head(dat)) 的结果,以便我们知道您的数据当前的样子。请参阅这篇关于在 R 中创建可重现示例的帖子:stackoverflow.com/questions/5963269/…
  • split(dat, cut(strptime(dat$ut_ms, format = '%F %R'), 'hour')) 会将您的数据拆分为一个列表。您可以使用lapply 来遍历列表。
  • by 也可以。

标签: r aggregate moving-average


【解决方案1】:

您可以每小时拆分数据并进行迭代,

list1 <- split(dat, cut(strptime(dat$ut_ms, format = '%Y-%m-%d %H:%M'), 'hour'))
lapply(list1, colMeans)

【讨论】:

  • 当我使用 lapply 时,我注意到错误“x 必须是数字”,我注意到我的时间是因子格式。我试图将时间从因子更改为数字,但我无法拆分数据。有没有办法在 lapply 中更改格式?
【解决方案2】:

当您将数据重新排列为长格式时,事情会变得容易得多

n.system <- 34
n.time <- 100
temp <- rnorm(n.time * n.system)
temp <- matrix(temp, ncol = n.system)
seconds <- runif(n.time, max = 3 * 3600)
time <- as.POSIXct(seconds, origin = "1970-01-01")
dataset <- data.frame(time, temp)

library(dplyr)
library(tidyr)
dataset %>%
  gather(key = "system", value = "temperature", -time) %>%
  mutate(hour = cut(time, "hour")) %>%
  group_by(system, hour) %>%
  summarise(average = mean(temperature))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2021-05-09
    • 2016-02-19
    相关资源
    最近更新 更多