2013-09-13 4 views
0

У меня есть большой набор метеорологических данных с полчаса. Я использую функцию ddply для создания ежедневных значений (средства, суммы и т. Д.), Однако у меня возникают проблемы с получением значений min и max! Для некоторых значений, например. температура воздуха я хотел бы извлечь ежедневное среднее значение, мин и макс, однако возвращенный кадр данных дает мне минимальные и максимальные значения, которые являются такими же, как среднее. Может ли кто-нибудь взглянуть на команду, которую я написал, чтобы увидеть, не обнаружены ли какие-либо ошибки?среднее, максимальное, мин. Функции с ddply

HFTda <- ddply (HFT, .(Year, DOY),summarise, 
       Temp = mean (Temp, na.rm = F), 
       Tmax = max (Temp, na.rm = F), 
       Tmin = min (Temp, na.rm = F), 
       RHmax = max (RH.x, na.rm = F), 
       RHmin = min (RH.x, na.rm = F), 
       VPD = mean (VPD.x, na.rm = F), 
       Grad = mean (GradInc2, na.rm = F), 
       Gex = mean (Gex, na.rm = F), 
       Prec = sum (Prec, na.rm = F), 
       H = mean (HFill, na.rm = F), 
       LE = mean (LEFill, na.rm = F), 
       NEE = mean (co2_fluxFill, na.rm = F), 
       ET = mean (h2o_fluxFill, na.rm = F), 
       SWout = mean (YB5214h, na.rm = F)) 
+0

NB: Ежедневный раскол основан на год и день числа (DOY) – user1959078

+3

Приведите пример воспроизводимости. Мой совет заключается в том, чтобы поместить ваш вызов в анонимную функцию и поместить вызов браузера внутрь, чтобы вы могли проверить все свои значения. –

+0

I second @KarlForner Добавьте вывод из 'dput (head (HFT))' к вопросу, в кодовом блоке. –

ответ

4

Несмотря на отсутствие воспроизводимого примера, я думаю, что у меня есть идея; Я думаю, что проблема в том, что вы принимаете среднее temp (и перезаписать значение локально), прежде чем пытаться получить его мин и макс:

прелиминария:

d <- data.frame(day=rep(1:2,each=4),Temp=1:8) 
library(plyr) 

урезанного пример:

ddply(d, .(day), summarise, 
    Temp = mean (Temp), 
    minTemp = min(Temp)) 
## day Temp minTemp 
## 1 1 2.5  2.5 
## 2 2 6.5  6.5 

Самым простым решением является просто изменить порядок:

ddply(d, .(day), summarise, 
    minTemp = min(Temp), 
    Temp = mean (Temp)) 
## day minTemp Temp 
## 1 1  1 2.5 
## 2 2  5 6.5 

В качестве альтернативы (возможно, лучше), вы можете обратиться к вашей средней переменной, как meanTemp ...

http://r4stats.com/2013/01/22/comparing-tranformation-styles/ связана (по-видимому, summarise делает mutate -стиль оценки)

+0

Отлично! Да, проблема в том, что имя среднего значения совпадает с именем исходных данных, это вычисляется первым, так как функция ddply выполняет расчет в заданном порядке! Да, самым простым решением является просто изменить имя на «aveTemp» или «meanTemp» – user1959078

+1

P.s. Извините за отсутствие примерного фрейма. Я просто был уверен, что проблема была в самом коде, и хотя те, кто работает с ddply, распознают проблему с кодом. В любом случае, в следующий раз, когда у меня возникнет вопрос, я обязательно стану упрощенным примером рассматриваемого блока данных. Спасибо за решение Ben и спасибо за комментарии от других! – user1959078

Смежные вопросы