我正在研究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的关系。
答案 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_day
,group_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