我有以下代码来选择最高和最低温度都有高温(高于两者的90%)的天数(24小时)。该代码计算每个事件的长度和每个事件期间记录的最高平均温度。
setDT(df)
df[, hotday := +(df$MAX>=(quantile(df$MAX,.90, na.rm = T, type = 6)) & df$MIN>=(quantile(df$MIN,.90, na.rm = T, type = 6)))
] [, hw.length := with(rle(hotday), rep(lengths,lengths))
] [hotday==0, hw.length:=0][!!hotday, Highest_Mean := max(MEAN) , rleid(hw.length)][]
代码的结果如下所示:
> head(df)
YEAR MONTH DAY Date MEAN MAX MIN D hotday hw.length Highest_Mean
1: 1991 5 14 5/14/1991 32.2 41.0 23.6 17.4 1 3 34.9
2: 1991 5 15 5/15/1991 34.9 43.3 26.0 17.3 1 3 34.9
3: 1991 5 16 5/16/1991 31.4 39.2 23.6 15.6 1 3 34.9
4: 1994 5 27 5/27/1994 30.7 41.0 23.0 18.0 1 2 30.7
5: 1994 5 28 5/28/1994 30.6 39.4 23.4 16.0 1 2 30.7
第一个事件活了3天,最高的平均值是34.9,但是代码没有告诉记录的是哪一天(是在事件的第一天,第二天或第三天)。 如何添加一个列以提供该信息以及最大长度(非重复值,每个事件一个)?像这样的东西
YEAR MONTH DAY Date MEAN MAX MIN D hotday hw.length Highest_Mean mean.day.max.length
1: 1991 5 14 5/14/1991 32.2 41.0 23.6 17.4 1 3 34.9
2: 1991 5 15 5/15/1991 34.9 43.3 26.0 17.3 1 3 34.9 2-3
3: 1991 5 16 5/16/1991 31.4 39.2 23.6 15.6 1 3 34.9
答案 0 :(得分:0)
最好为每个热浪事件添加一个唯一的识别码,然后将其编入索引,但这个解决方案可行(只要两个事件的长度和最大平均温度不完全相同)
hottest_day = which(df$MEAN == df$Highest_Mean)
df$mean.day.max.length=""
for(i in hottest_day){
subset=df[(which(df$hw.length==df$hw.length[i] & df$Highest_Mean==df$Highest_Mean[i])),]
df$mean.day.max.length[i]=paste0(which(subset$MEAN==df$Highest_Mean[i]),"-",df$hw.length[i])
}