如何在一系列数据中查找给定长度的运行?

时间:2015-05-06 17:02:47

标签: r

我试图研究流量在给定水平下运行的时间。我想找到流量超过给定水平4小时或更长时间的情况。我该怎么做呢?

示例代码:

temp <- df %>%
  mutate(highFlowInterval = cumsum(isHighFlow==1)) %>%
  group_by(highFlowInterval) %>%
  summarise(hoursHighFlow = n(), minDate = min(as.character(Date)), maxDate = max(as.character(Date))) 

#Then join the two tables together. 
temp2<-sqldf("SELECT * 
  FROM temp LEFT JOIN df 
  ON df.Date BETWEEN temp.minDate AND temp.maxDate")

我被要求编辑我的问题以提供我希望看到的输出。

我希望看到如下所示的数据。唯一的问题是hourseHighFlow不正确。我不确定如何修复代码以生成正确的hoursHighFlow。

t<-subset(temp2,isHighFlow==1)
t<-subset(t, hoursHighFlow>=4)

能够使用子集来选择以高流速运行的时间长度。

<div id="div1">Fist div</div> 
<div id="div2">Second div </div>


#div1{

 animation: slideup 7s;
    -moz-animation: slideup 7s;
    -webkit-animation: slideup 7s;
    -o-animation: slideup 7s;
}

#div2
{
    position:relative;
}

@keyframes slideup
{
0%   {top:0px;}
75%  {top:0px;}
100% {top:-20px;}
}

@-moz-keyframes slideup
{
0%   {top:0px;}
75%  {top:0px;}
100% {top:-20px;}
}

@-webkit-keyframes slideup
{
0%   {top:0px;}
75%  {top:0px;}
100% {top:-20px;}
}

@-o-keyframes slideup
{
0%   {top:0px;}
75%  {top:0px;}
100% {top:-20px;}
}

2 个答案:

答案 0 :(得分:2)

将其放入data.table:

require(data.table)
DT <- data.table(df)

标记跑步和长度:

DT[,`:=`(r=.GRP,rlen=.N),by={r <- rle(isHighFlow);rep(1:length(r[[1]]),r$lengths)}]

长跑的子集:

DT[rlen>4L]

工作原理:

  • DT[i,j,by]的{​​{1}}的第二个参数中创建了新列。
  • :=.GRP分别是.N组的索引和大小的特殊变量。
  • by不同,data.table只能与DT[i]成为子集。

除了子集外,大多数适用于data.frame的内容在data.frame上的工作方式相同。

答案 1 :(得分:1)

以下是使用dplyr包的解决方案:

df %>%
  mutate(interval = cumsum(isHighFlow!=lag(isHighFlow, default = 0))) %>%
  group_by(interval) %>%
  summarise(hoursHighFlow = n(), minDate = min(as.character(Date)), maxDate = max(as.character(Date)), isHighFlow = mean(isHighFlow)) %>%
  filter(hoursHighFlow >= 4, isHighFlow == 1)

<强>结果:

   interval hoursHighFlow          minDate          maxDate isHighFlow
1        25             4 2014-01-03 07:00 2014-01-03 10:00          1
2       117             4 2014-01-12 01:00 2014-01-12 04:00          1
3       245             6 2014-01-23 13:00 2014-01-23 18:00          1
4       401             6 2014-02-07 03:00 2014-02-07 08:00          1
5       437             5 2014-02-11 02:00 2014-02-11 06:00          1
6       441             4 2014-02-11 21:00 2014-02-12 00:00          1
7       459             4 2014-02-13 09:00 2014-02-13 12:00          1
8       487             4 2014-02-16 03:00 2014-02-16 06:00          1
9       539             7 2014-02-21 08:00 2014-02-21 14:00          1
10      567             4 2014-02-24 11:00 2014-02-24 14:00          1
..      ...           ...              ...              ...        ...

正如Frank指出的那样,使用rle设置间隔可以达到相同的效果,将mutate行替换为:

mutate(interval = rep(1:length(rle(df$isHighFlow)[[2]]),rle(df$isHighFlow)[[1]])) %>%