2016-05-25 2 views
0

У меня есть данные с 3-часовыми значениями, и я хочу вычислять среднесуточные значения, но я должен делать это по разнице между двумя последовательными временными интервалами. Это пример моих данных:среднесуточный после применения diff

 prec= 
     c(5068.51904296875, 5068.53076171875, 5068.5654296875, 5068.5927734375, 
     5068.60107421875, 5068.60107421875, 5068.60107421875, 5068.60205078125, 
     5068.6123046875, 5068.6171875, 5068.6171875, 5068.6171875, 5068.6171875, 
     5068.6171875, 5068.6171875, 5068.6171875, 5068.61865234375, 5068.646484375, 
     5068.662109375, 5068.6669921875, 5068.67138671875, 5068.6728515625, 
     5068.7138671875, 5068.74169921875) 

     days= 
     structure(c(7670, 7670, 7670, 7670, 7670, 7670, 7670, 7670, 7671, 
     7671, 7671, 7671, 7671, 7671, 7671, 7671, 7672, 7672, 7672, 7672, 
     7672, 7672, 7672, 7672), class = "Date") 

Таким образом, я должен был бы сделать:

dfprec <- diff(prec,lag=1) 

Мой вопрос, как я могу получить сейчас ежедневные средства ?? Я мог бы использовать aggregate или tapply .. но теперь dfprec имеет одно «время» меньше в днях ... Любое предложение?

+0

Вы должны добавить один NA: 'с (NA, dfprec) или' c (dfprec, NA) ', чтобы получить ту же длину, что и исходный вектор. – jogo

+1

Можете ли вы указать, какое поведение на пределе каждого дня? Вы хотите, чтобы каждая разница относилась к предыдущему или следующему временному значению? или, возможно, не учитывать первое или последнее различие каждого дня? – agenis

ответ

2

Зачем вам нужно сохранять размер вектора?

Это, кажется, работает нормально:

res <- tapply(prec, days, function(p) {mean(diff(p))}) 
res 
# 1991-01-01 1991-01-02 1991-01-03 
# 0.0118582589 0.0006975446 0.0175781250 
+0

Я не думаю, что нужно будет выбросить первое измерение в каждый день. Я бы, наверное, сделал «tapply» (c (NA, diff (prec)), days, FUN = mean, na.rm = TRUE). – Frank

+0

это изменяет результат? – Bulat

+0

Да, так оно и есть, так как в нем используются наблюдения, которые выбрасываются сюда (разница между первым обс в один день и последний обс в предыдущий день). – Frank

1

Используйте функцию сдвига из библиотеки data.table:

DT1 = data.table(prec,days) 

DT1[,dprec := prec - shift(prec,1), by=days][,mean(dprec,na.rm = TRUE),by=days] 
Смежные вопросы