我试图研究流量在给定水平下运行的时间。我想找到流量超过给定水平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;}
}
答案 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]])) %>%