找出相对于R中特定日期的平均值

时间:2015-04-14 20:22:49

标签: r aggregate normalize lubridate

我正在研究R中的一些气象数据,从概念上讲,我试图找出某一天高于/低于平均值的天数。要做到这一点,我想在一年中分开,找到所有DOY的平均值(例如1月1日的平均温度是多少?),然后比较每个日期(例如2014年1月1日异常温暖,多少? )

我可以使用聚合找到一年中每一天的“平均”表格:

head(data)
          x       date
1  5.072241 1970-01-01
2  6.517069 1970-01-02
3  4.413654 1970-01-03
4 11.129351 1970-01-04
5  9.331630 1970-01-05

library(lubridate)
temp = aggregate(data$x, list(yday(data$date)), mean)

但我不知道如何使用聚合表与我原来的data.frame进行比较,看看1月1970年的x与平均1月1日x的关系。

3 个答案:

答案 0 :(得分:3)

我们可以使用sub('Monthday')删除'year'部分。如果需要按'Monthday'分组创建Mean变量,请使用ave

data$Monthday <- sub('\\d+-', '', data$date)
data$Mean <- with(data, ave(x, Monthday))

然后,我们可以与'x'变量进行比较,例如

data$rel_temp <- with(data, x/Mean)

答案 1 :(得分:3)

您也应该使用dplyr

library(dplyr); library(lubridate)

data %>% mutate(year_day = paste0(month(date), "_",mday(date))) %>% 
  group_by(year_day) %>% mutate(relev_temp = x/mean(x)) %>% ungroup

逻辑如下: 创建一个新变量year_day,它只是每个日期mutate(year_day =...

的月份和日期

然后取温度x并除以year_daygroup_by(year_day) %>% mutate(relev_temp = x/mean(x))

的平均温度

答案 2 :(得分:0)

感谢您的反馈。 @ akrun的回答对我很有用。

作为替代方案,我也一起攻击这个,它产生与@ akrun的答案相同的输出(并且对于40年的每日数据来说慢了1/10秒):

    averages = aggregate(x, list(DOY = yday(date)), mean)
    temp = merge(data.frame(x,date, DOY = yday(date)), averages, by = 'DOY')  
    head(temp[order(temp$date),])
    DOY   x.x       date       x.y
1     1 -12.0 1970-01-01 -8.306667
70    2 -14.2 1970-01-02 -8.695556
113   3 -16.7 1970-01-03 -8.060000
157   4 -13.6 1970-01-04 -8.233333
200   5 -19.2 1970-01-05 -8.633333
243   6 -15.0 1970-01-06 -8.922222