添加超过阈值的连续临时值以创建“度数小时”

时间:2017-01-17 04:14:28

标签: r dataframe threshold temperature

我正在处理每小时温度的数据集,我需要计算每个极端事件的热度阈值以上的“度数小时”。我打算对每个事件的强度(组合幅度和持续时间)运行统计数据,以比较同一时间段内的多个站点。

数据示例:

        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

我讨论过在一个时间序列中操作这些数据或者添加其他列,但我不希望每个加温事件都有多行。我非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

这是基础R的替代解决方案。

你有一些数据可以走动,你想要总结一个截止点以上的点数。例如:

set.seed(99999)
x <- cumsum(rnorm(30))
plot(x, type='b')
abline(h=2, lty='dashed')

看起来像这样:

enter image description here

首先,我们希望根据跨越截止时间将数据拆分为组。我们可以在指标上使用行程编码来获得压缩版本:

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