我需要每年为我的数据计算季节性平均值,平均值的计算不在同一日历年中。我已经按日期定义了季节,并希望计算每年该时间段内的平均温度,降水量(例如12/21/1981
至02/15/1982
,12/21/1982
至02/15/1983
),因此上。
在R中是否有一种有效的方法?
以下是我的数据:
library(xts)
seq <- timeBasedSeq('1981-01-01/1985-06-30')
Data <- xts(1:length(seq),seq)
谢谢
答案 0 :(得分:0)
这是一种使用tidyverse语法的数据中心定位方法(如果愿意,可以将其翻译为基数R):
library(tidyverse)
df_in <- tibble(
date = seq(as.Date('1981-01-01'), as.Date('1985-06-30'), by = 'day'),
x = seq_along(date)
)
str(df_in)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 1642 obs. of 2 variables:
#> $ date: Date, format: "1981-01-01" "1981-01-02" ...
#> $ x : int 1 2 3 4 5 6 7 8 9 10 ...
df_out <- df_in %>%
# reformat data to keep months and days, but use identical year, so...
mutate(same_year = as.Date(format(date, '1970-%m-%d'))) %>%
# ...we can subset to rows we care about with simpler logic
filter(same_year < as.Date('1970-02-15') | same_year > as.Date('1970-12-21')) %>%
# shift so all in one year and use for grouping
group_by(run = as.integer(format(date - 60, '%Y'))) %>%
summarise( # aggregate each gruop
start_date = min(date),
end_date = max(date),
mean_x = mean(x)
)
df_out
#> # A tibble: 5 x 4
#> run start_date end_date mean_x
#> <int> <date> <date> <dbl>
#> 1 1980 1981-01-01 1981-02-14 23
#> 2 1981 1981-12-22 1982-02-14 383
#> 3 1982 1982-12-22 1983-02-14 748
#> 4 1983 1983-12-22 1984-02-14 1113
#> 5 1984 1984-12-22 1985-02-14 1479
答案 1 :(得分:0)
如果我们将时间提前11天,那么我们想要的日期是2月26日或之前的日期,因此让tt
是这样的日期向量,而ok
是逻辑向量,如果是,则为TRUE相应的tt
元素在2月26日或之前。最后,在期末之前汇总Data[ok]
。
tt <- time(Data) + 11
ok <- format(tt, "%m-%d") < "02-26"
aggregate(Data[ok], as.integer(as.yearmon(tt))[ok], mean)
给予:
1981 23.0
1982 382.5
1983 747.5
1984 1112.5
1985 1478.5
如果您想在没有xts的情况下进行操作,那么假设我们的输入为DF
,请尝试以下操作:
DF <- fortify.zoo(Data) # input
tt <- DF[, 1] + 11
ok <- format(tt, "%m-%d") < "02-26"
year <- as.numeric(format(tt, "%Y"))
aggregate(DF[ok, -1, drop = FALSE], list(year = year[ok]), mean)