рассчитать среднее значение с пороговым числом дней для каждого месяца в г - PullRequest
0 голосов
/ 01 июля 2019

У меня есть фрейм данных временного ряда R, состоящий из нескольких переменных для каждого дня для данных за 19 лет. Я хотел бы вычислить среднее значение только по месяцам, значения которых превышают 10 дней. Таким образом, если месяц (например, январь за весь период 1996-2015 гг.) Имеет значения менее 10 дней, я бы хотел исключить его для расчета среднемесячного значения за весь период времени.

Фрейм данных выглядит следующим образом:

        date val1,val2,val3,val4,val5
1 1996-01-01 5.25,4.20,3.58,6.44,2.66
2 1996-01-02 10.11,9.22,14.25,12.11,13.22
3 1996-01-03 25.11,30.44,45.22,31.24,27.35
..
..
..
7305 2015-12-31 30.54,55.14,63.12,51.22,45.21

Есть идеи?

1 Ответ

0 голосов
/ 01 июля 2019

Вы можете сначала получить количество наблюдений в месяц с помощью aggregate, а затем ограничить свой набор данных теми, у которых есть по крайней мере minDays наблюдений, используя merge.

x <- read.table(sep=c(","), head=T, as.is = TRUE, text=
"date,val1,val2,val3,val4,val5
1996-01-01,5.25,4.20,3.58,6.44,2.66
1996-01-02,10.11,9.22,14.25,12.11,13.22
1996-01-03,25.11,30.44,45.22,31.24,27.35")

minDays <- 10
x$ym <- substr(x$date,1,nchar(x$date)-3) #get year month out of date
tt <- aggregate(val1 ~ ym, data=x, FUN=length) #Get number of observations per month
aggregate(val1 ~ ym, data=merge(x, tt[tt$val1>=minDays, "ym", drop=FALSE]), FUN=mean) #Calculate mean when n observations are >= minDays

Или используя ave:

x <- read.table(sep=c(","), head=T, as.is = TRUE, text=
"date,val1,val2,val3,val4,val5
1996-01-01,5.25,4.20,3.58,6.44,2.66
1996-01-02,10.11,9.22,14.25,12.11,13.22
1996-01-03,25.11,30.44,45.22,31.24,27.35")

minDays <- 10
x$ym <- substr(x$date,1,nchar(x$date)-3) #get year month out of date
x$n <- with(x, ave(val1, ym, FUN=length))
aggregate(val1 ~ ym, data=x[x$n>=minDays,], FUN=mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...