Как я могу подсчитать среднюю температуру каждый час в разных столбцах R

У меня есть фрейм данных, который состоит из даты и температуры 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)

Я добавил изображение данных. Для лучшего понимания того, что я хочу.


person Extria    schedule 10.05.2016    source источник
comment
Добро пожаловать в SO. Можете ли вы отредактировать свой вопрос и включить результат dput(head(dat)), чтобы мы знали, как сейчас выглядят ваши данные. См. Этот пост о создании воспроизводимого примера в R: stackoverflow.com/questions/5963269/   -  person Phil    schedule 10.05.2016
comment
split(dat, cut(strptime(dat$ut_ms, format = '%F %R'), 'hour')) разделит ваши данные на список. Вы можете использовать lapply для обхода списка.   -  person Sotos    schedule 10.05.2016
comment
by тоже подойдет.   -  person Roman Luštrik    schedule 10.05.2016


Ответы (2)


Вы можете разделить свои данные по часам и пошагово,

list1 <- split(dat, cut(strptime(dat$ut_ms, format = '%Y-%m-%d %H:%M'), 'hour'))
lapply(list1, colMeans)
person Sotos    schedule 10.05.2016
comment
Когда я использую lapply, я получаю ошибку x, должно быть, числовое значение. Я заметил, что мое время указано в факторном формате. Я попытался изменить время с множителя на числовое, но не могу разделить данные. Есть ли способ изменить формат в lapply? - person Extria; 10.05.2016

Когда вы переставляете данные в длинный формат, все становится намного проще

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))
person Thierry    schedule 10.05.2016