Mam codzienne dane opadów z 1880-2011. Dane są w formacie df o nazwie STATION i przyjmują postać:
STATION: 47486 obs. of 4 variables
Year: int 1880 1880 ...
Month: int 1 1 1 ...
Day: int 1 2 3 ...
PPT: num 0.4 0 0 ...
Zastosowałem następujące dane do pogrupowania danych w średnie miesięczne wartości opadów, gdy dzienne opady przekraczają 0,2 mm:
MONTHLY.MEAN=STATION %>% group_by(Year,Month) %>%
filter(PPT>=0.2)%>%summarise(s = mean(PPT))
Działa to dobrze, ale jest miesiącrekord (kwiecień 2007 r.), w którym nie było żadnych dni powyżej 0,2 mm, a zatem ten miesiąc został wycięty z pliku wyjściowego. Chcę, aby została uwzględniona jako zero, nawet jeśli nie spełnia kryteriów określonych w formule. Czy można to zrobić?
Mam nadzieję, że to ma sens.
Odpowiedzi:
1 dla odpowiedzi № 1Korzystanie z dplyr:
MONTHLY.MEAN=STATION %>% group_by(Year,Month) %>%summarise(s = mean(PPT[PPT>=0.2]))
Możliwe rozwiązanie przy użyciu data.table:
library(data.table)
setDT(STATION)
STATION[,mean(PPT[PPT >= 0.2]),by=c("Month","Year")]
W obu kodach miesiące, które nie mają wartości PPT> 0,2 mm, zostaną uwzględnione jako NaN. Możesz łatwo przekonwertować je na zero.
0 dla odpowiedzi nr 2
Rozważ agregowane filtrowane wiązanie wierszy:
MONTHLY.MEAN <- rbind(
STATION %>% group_by(Year,Month) %>%
filter(PPT>=0.2) %>% summarise(s = mean(PPT)),
STATION %>% group_by(Year,Month) %>%
filter(max(PPT)<0.2) %>% summarise(s = 0)
)
# RE-ORDER DATA FRAME
MONTHLY.MEAN <- MONTHLY.MEAN[with(MONTHLY.MEAN, order(Year, Month)),]