#r
#r
Вопрос:
В приведенных ниже данных есть значения для 2005
и 2006
. Каждый год имеет 2 столбца как h1
и h24
. Функция myfun
используется h1
для агрегирования почасовых данных до 6, 12 и 24 часовых данных в виде h6
, h12
и h24
и нахождения их средств в виде mean1
, mean6
, mean12
и mean24
для каждого года отдельно и перечисления их.
Заголовок данных:
X2005.h1 X2005.h24 X2006.h1 X2006.h24
1 0 0.0 0 0.0
2 0 0.0 0 8.6
3 0 3.4 0 11.2
4 0 21.4 0 8.4
5 0 1.8 0 0.0
6 0 1.4 0 0.0
И все мои данные:
myd<-structure(list(X2005.h1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0.6, 0.2, 0, 0, 0.6, 0.2, 0.6, 0.6, 0, 0, 0, 0.6, 1.2, 1.8,
1.8, 1.2, 1, 1.2, 1.6, 1.2, 1.4, 1, 1.2, 0.8, 0.8, 0.2, 0, 0,
1.6, 0.4, 0, 0.4, 1.2, 0.8, 0.2, 0.4, 0.2, 0.4, 0.4, 0.2, 0.2,
0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2,
0.4, 0.4, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0.2, 0.4, 1.2, 1.6, 2.2, 1.8, 0.4, 0.6, 0,
0.2, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0.2, 0, 0.6, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.4, 0.2, 0, 0, 0.8, 0, 0, 0.2, 0, 0, 0, 0, 0.2, 0.2, 0.2, 0,
0, 1.2, 4, 0.2, 0, 0, 0, 0, 0, 0, 0, 1.6, 0.6, 0, 0, 0, 1.4,
0.6, 0.4, 0.8, 0, 0, 0, 0, 0.2, 0, 0.2, 0, 0, 0, 0, 0.6, 0, 0,
0, 0, 0.2, 1.2, 1, 1.8, 2, 1.8, 0.4, 0.6, 1.2, 1.8, 1.4, 1.2,
0.6, 0.4, 0, 0.2, 0.2, 1.6, 1.6, 1.4, 0.8, 0.4, 0.2, 0.2, 0,
0.6, 0, 0.4, 0.4, 0.2, 0.2, 0.2, 0.4, 0.4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0.2, 0.2, 0.4,
0.4, 1.6, 1.8, 1.2, 1.4, 1.4, 1.4, 0.6, 0.6, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), X2006.h1 = c(0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2, 4.8, 1, 0, 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0,
0, 0, 6.6, 0.2, 0, 0, 0.2, 0, 0, 0.2, 0, 1.4, 0, 1.2, 0, 0.2,
0, 0.2, 1, 0, 0, 0, 0, 0, 0.2, 1.8, 2, 2.2, 0.6, 0.8, 0, 0, 0,
0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0.4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 1.8, 5.8, 0.2, 0.4, 0,
3.8, 0.2, 1.2, 0.4, 0, 0, 1, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.6, 0.4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8, 0.8, 1, 0.2,
0, 0.2, 0, 0, 0.6, 2.4, 0.2, 0, 0.2, 0, 0, 1.6, 0.2, 2, 0, 1.2,
4.6, 0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0.2, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8, 0.4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0, 0, 0, 0.2, 0,
0, 0, 0, 0, 0, 0, 0, 0.2, 1.8, 0.6, 0, 0, 0, 0.4, 2, 1, 0.8,
0.4, 0.2, 0, 0.2, 0, 0.8, 0.8, 0.2, 0.2, 0, 0.4, 0.4, 0.6, 0.8,
4, 2, 0.8, 2.6, 1.4, 0.6, 1, 1, 1, 1.2, 1.2, 0.8, 1.6, 1.8, 0.4,
0.2, 0.2, 0.2, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.6, 1.2, 0.6, 0.8, 0.8, 1, 0.8, 1.2, 1.2, 0.8, 1, 2.2, 3.4,
2.6, 1.8, 1.6, 1.8, 3.6, 3, 1.8, 3.2, 1.8, 1, 0.6, 0.4, 0, 1,
0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.6, 3.8, 0.2, 0.4,
0, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.4, 0, 0, 0, 0.2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0.2, 0.6,
0, 0.6, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 1, 0, 0, 0, 0.2,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0.4, 0.6, 0.4, 0.6,
1, 0.8, 0.2, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.6, 1.4, 2.2, 0, 0.4, 1, 0.6, 0,
1.2, 1.6, 0.6, 0, 0.2, 0, 0, 0, 0, 0, 0.2, 0, 0, 0.2, 0, 0, 0.2,
0, 0.2, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.2, 0, 1.2, 0.4, 1, 0.6,
0.8, 1, 0, 0, 0, 0, 0), X2005.h24 = c(0, 0, 3.4, 21.4, 1.8, 1.4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 8.6, 1.4, 0, 0, 0, 0, 0.6, 7, 6.4,
21.8, 3.2, 0, 0, 0.6, 11.2, 0), X2006.h24 = c(0, 8.6, 11.2, 8.4,
0, 0, 0, 0, 0, 7.8, 7.6, 1.2, 10.2, 7, 0, 0, 1.6, 7.6, 23.6,
3.2, 0, 9, 31.4, 10, 2.2, 1.6, 0, 4.8, 10, 1.2, 4.6)), .Names = c("X2005.h1",
"X2006.h1", "X2005.h24", "X2006.h24"))
Функция:
myfun<- function(x) {
y<-as.matrix(sapply(x, as.numeric))
#Aggregating hourly (h1) data to 6,12 hourly data
h<-sapply(c(1, 6, 12), function(hrs) colSums(matrix(y, ncol=length(x)/hrs)))
hours<-sapply(list(h[[1]], h[[2]], h[[3]]), function(qq) list(qq))
names(hours)<-c("h1", "h6", "h12")
#Calculating means of 1, 6, 12 hourly data
means<-sapply(list(hours[[1]], hours[[2]], hours[[3]]), function(ss) mean(ss, na.rm = T))
#means of 1, 6, 12 hourly data
mean1<-means[[1]]
mean6<-means[[2]]
mean12<-means[[3]]
mean24<- means[[4]]
meanlist<-list(mean1, mean6, mean12, mean24)
names(meanlist) <- c("mean1", "mean6", "mean12", "mean24")
return(meanlist)
}
Чего я хочу, так это:
Как упоминалось ранее, 6-12-24 почасовые значения получаются с помощью агрегирования почасовых данных h1
как h6
, h12
и h24
. mean1
, mean6
, mean12
и mean24
вычисляются в цикле с lapply
функцией для каждого года.
Означает mean1
, mean6
, mean12
все в порядке. Но для получения mean24
я хочу использовать h24
данные (x2005.h24, x2006.h24, …) вместо агрегированных h24
данных. Как я могу этого добиться?
Комментарии:
1. Предоставленные вами данные не являются табличными (без строк или столбцов), это список из 4 элементов
X2005.h1
,X2005.h24
,X2006.h1
, иX2006.h24
, первые два имеют длину 744, а последние два имеют длину 31, это данные за один месяц? если нет, то что вы подразумеваете под почасовыми данными? и с предоставленными вами примерами данных, как ожидается, будет выглядеть результат?2. i.stack.imgur.com/HHnaQ.png Результат будет таким. Да, это ежемесячные данные. данные длиной 31 — ежедневные, 744 — почасовые данные. Но для нахождения средних значений данных за 1-6-12 часов я буду использовать только данные длиной 744, но для нахождения среднего значения 24-часовых данных я буду использовать ежедневные данные (длиной 31)
3. Почему бы не сделать то же самое для среднего значения за 24 часа?
4. Из-за этого возникла проблема. Данные получены с метеорологической станции и за месяц; суммы почасовых данных обычно не равны сумме ежедневных данных. И реальные ежедневные данные являются истинными. Поэтому я решил получить среднее значение основных ежедневных данных
Ответ №1:
Я должен сказать, что я не привык анализировать данные, представленные в списках, обычно data.frames или временных рядах, это кажется не очень эффективным, но поскольку у меня нет лучшего предложения, вот один из способов, которым это можно сделать, создайте новый список, который включает нужные вам данные (каждые шесть и 12 часов), а затем применить среднее значение к каждому элементу
# list with 1h data
l1 <- myd[grepl('h1', names(myd))]
# list with 6h and 12h data
l6_12 <- names(myd)[grepl('h1', names(myd))] %>%
lapply(function(x) {
setNames(lapply(c(6,12),
function(h) rowSums(matrix(myd[[x]], ncol = h))),
c(gsub('h1', 'h6', x), gsub('h1', 'h12', x)))
}) %>%
unlist(recursive = FALSE)
# list with 24h data
l24 <- myd[grepl('h24', names(myd))]
# combine all three together and then take the mean of each element (in this case 8 elements in total)
c(l1, l6_12, l24) %>% lapply(mean)