连续时间计数对于数据是带外的 –
我有频率数据(间隔-1分钟)。 我想计算一下数据带外的连续时间(带49到51)。 我不想要总时间。 我需要连续的时间在不同的时间发生。 假设在6 PM的一天频率样本是48.3 48.2,48.7,49.1。 结果应该是3分钟。 使用R或Excel,我该怎么做?
在Tableau中,可以使用沿时间维度运行的表格计算。
例如,定义一个名为in_band as的计算字段
[Frequency] >= 49 and [Frequency] <= 51
然后计算一个名为current_minutes_out_of_band的字段为
if attr(in_band) then 0 else previous_value(0) + 1 end
如果将“分钟(时间)”放在“行”(Rows)书架上并使其离散,则可以将“current_minutes_out_of_band”放在“文本”(Text)书架上,然后观察计数器在带外累积分钟数。
只要频率返回到所需频段,该expression式就会将计数器重置为零。 如果你想要一个运行总数,那更容易 – 只要定义一个字段,如果in_band返回1,否则返回0。 将该字段放置在一个架子上,右键单击它并select快速Table Calc运行总计
这假定每分钟一个数据行没有间隙。 可以概括为避免这些假设。
表格计算是在客户端/服务器划分的客户端计算的,因此需要通过线路获取每行时间和频率。 对于大型数据集,在数据源处进行计算通常更有效,并只发送聚合结果。 SQL窗口函数或Oracle分析函数可以做到这一点。
表计算还取决于正确设置寻址和分区。 有关详细信息,请参阅表格calcs上的文档。
在Excel中,可以使用数组公式search下一个处于范围内的频率:
=MATCH(1,(B2:B$10>=49)*(B2:B$10<=51),0)-1
如果你的频率在B2开始。
必须使用Ctrl Shift Enter在C2中input
这是一个修改后的版本,它允许在最后一个频率超出范围的情况下,假设频率值和最后一个或多个空白之间没有空白。
=MATCH(1,(B2:B$10>=49)*(B2:B$10<=51)+(B2:B$10=""),0)-1
这可以在R中使用rle
函数优雅地完成, rle
函数计算数据的运行长度编码。 考虑一些示例input:
times <- paste0("18:0", 0:8) freq <- c(48.3, 48.2, 48.7, 49.1, 50, 51.1, 51.2, 52, 50)
我们可以使用rle
来确定带外时间的长度(每个3分钟2段):
with(rle(freq < 49 | freq > 51), lengths[values]) # [1] 3 3
我们也可以确定这些运行结束的时间:
with(rle(freq < 49 | freq > 51), times[cumsum(lengths)][values]) # [1] "18:02" "18:07"