我正在处理每小时温度的数据集,我需要计算每个极端事件的热度阈值以上的“度数小时”。我打算对每个事件的强度(组合幅度和持续时间)运行统计数据,以比较同一时间段内的多个站点。
数据示例:
Temp
1 14.026
2 13.714
3 13.25
.....
21189 12.437
21190 12.558
21191 12.703
21192 12.896
选择仅高于18度阈值的小时后的数据,然后减去18以显示高于18的度数:
Temp
5297 0.010
5468 0.010
5469 0.343
5470 0.081
5866 0.010
5868 0.319
5869 0.652
在此步骤之后,我需要帮助来连续读取超过指定阈值的小时数。
我希望用以上样本制作:
Temp
1 0.010
2 0.434
3 0.010
4 0.971
我讨论过在一个时间序列中操作这些数据或者添加其他列,但我不希望每个加温事件都有多行。我非常感谢任何建议。
答案 0 :(得分:2)
这是基础R的替代解决方案。
你有一些数据可以走动,你想要总结一个截止点以上的点数。例如:
set.seed(99999)
x <- cumsum(rnorm(30))
plot(x, type='b')
abline(h=2, lty='dashed')
看起来像这样:
首先,我们希望根据跨越截止时间将数据拆分为组。我们可以在指标上使用行程编码来获得压缩版本:
x.rle <- rle(x > 2)
的值为:
Run Length Encoding
lengths: int [1:8] 5 2 3 1 9 4 5 1
values : logi [1:8] FALSE TRUE FALSE TRUE FALSE TRUE ...
第一组是前5个点,其中x> 2是假的;第二组是以下两点,依此类推。
我们可以通过替换rle对象中的值来创建组ID,然后返回转换:
x.rle$values <- seq_along(x.rle$values)
group <- inverse.rle(x.rle)
最后,我们按组进行汇总,只保留截止值以上的数据:
aggregate(x~group, subset = x > 2, FUN=sum)
产生:
group x
1 2 5.113291213
2 4 2.124118005
3 6 11.775435706
4 8 2.175868979
答案 1 :(得分:1)
我为此使用data.table
,但肯定还有其他方法。
library( data.table )
setDT( df )
temp.threshold <- 18
首先创建一个列,显示数据中每个上一个的值。这将有助于找到温度超过阈值的点。
df[ , lag := shift( Temp, fill = 0, type = "lag" ) ]
现在使用前一个值列与Temp
列进行比较。将温度超过阈值的每个点标记为1,将所有其他点标记为0。
df[ , group := 0L
][ Temp > temp.threshold & lag <= temp.threshold, group := 1L ]
现在我们可以获得该新列的cumsum
,这将在温度超过阈值后为每个序列提供自己的group
ID。
df[ , group := cumsum( group ) ]
现在我们可以摆脱不超过阈值的每个值。
df <- df[ Temp > temp.threshold, ]
通过找到&#34;度数小时&#34;来总结剩下的内容。每个&#34;组&#34;。
bygroup <- df[ , sum( Temp - temp.threshold ), by = group ]
我稍微修改了您的输入数据,以提供一些数据超过阈值的测试事件:
structure(list(num = c(1L, 2L, 3L, 4L, 5L, 21189L, 21190L, 21191L,
21192L, 21193L, 21194L), Temp = c(14.026, 13.714, 13.25, 20,
19, 12.437, 12.558, 12.703, 12.896, 21, 21)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -11L), .Names = c("num",
"Temp"), spec = structure(list(cols = structure(list(num = structure(list(), class = c("collector_integer",
"collector")), Temp = structure(list(), class = c("collector_double",
"collector"))), .Names = c("num", "Temp")), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
根据这些数据,以上代码的输出(注意$V1
位于&#34;度数小时&#34;):
> bygroup
group V1
1: 1 3
2: 2 6