R 总开/关时间

标签 r dataframe

我有一个数据集,其中包含来自流量计的时间戳和流量数据(以加仑/分钟为单位),每 2 分钟记录一次数据。

df <- structure(list(dt = structure(c(1519891200, 1519891320, 1519891440, 1519891560, 
                1519891680, 1519891800, 1519891920, 1519892040, 1519892160, 1519892280,
                1519892400, 1519892520, 1519892640, 1519892760, 1519892880), 
       class = c("POSIXct", "POSIXt"), tzone = ""), 
       gpm = c(0, 0, 0, 50, 50, 50, 50, 50, 0, 0, 80, 80, 80, 0, 0)), 
       .Names = c("dt", "gpm"), 
       row.names = c(NA, 15L), 
       class = "data.frame")

#                     dt gpm
# 1  2018-03-01 03:00:00   0
# 2  2018-03-01 03:02:00   0
# 3  2018-03-01 03:04:00   0
# 4  2018-03-01 03:06:00  50
# 5  2018-03-01 03:08:00  50
# 6  2018-03-01 03:10:00  50
# 7  2018-03-01 03:12:00  50
# 8  2018-03-01 03:14:00  50
# 9  2018-03-01 03:16:00   0
# 10 2018-03-01 03:18:00   0
# 11 2018-03-01 03:20:00  80
# 12 2018-03-01 03:22:00  80
# 13 2018-03-01 03:24:00  80
# 14 2018-03-01 03:26:00   0
# 15 2018-03-01 03:28:00   0

我想将数据聚合到一个数据框中,其中包含开启、关闭时间以及该期间的平均 gpm。每次连续出现超过 2 个零时,都应算作一个新事件。

最终数据应如下所示:

#                    on                 off avg
# 1 2018-03-01 03:06:00 2018-03-01 03:14:00  50
# 2 2018-03-01 03:20:00 2018-03-01 03:24:00  80

最佳答案

dplyr中使用cumsum:

library(dplyr)
df %>% mutate(id = cumsum((gpm + c(0, lag(gpm)[-1])) == 0)) %>% 
  filter(gpm != 0) %>% group_by(id) %>% 
  mutate_at(vars(dt), .funs = list(on = min, off = max)) %>% 
  summarise_all(list(~mean(., na.rm=TRUE))) %>%
  select(-dt,-id,-gpm,gpm)

或者在data.table中使用rlecumsum:

library(data.table)
setDT(df)[, id := {
  rid <-rle(+(df$gpm + c(0,lag(df$gpm)[-1]) != 0 ))
  rid$values <- cumsum(rid$values) * rid$values
  inverse.rle(rid) * +(df$gpm!=0)
        }][gpm !=0
          ][ , list(on = min(dt), off = max(dt), gpm = mean(gpm)) , 
               by = .(id)][,id:=NULL][]

输出将是:

#                    on                 off gpm
# 1 2018-03-01 03:06:00 2018-03-01 03:14:00  50
# 2 2018-03-01 03:20:00 2018-03-01 03:24:00  80

关于R 总开/关时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949186/

相关文章:

r - 处理 htmlParse 错误(无法加载 HTTP 资源)

r - 将 R 数据框分成几行

python - 迭代数据框仅返回列标题

python - Pandas :水平扩展/分解数据框

python - 在 IPython.display HTML 中用逗号添加千位分隔符

r - 是否可以在没有 %% 的情况下定义运算符?

R:用序列化对象创建 CSV

r - 如何从两个向量(一个是键,另一个是值)在 R 中创建一个列表?

excel - 在 Julia 中从数据框转到 excel 文件时出错

python - 如果条件不适用于 Titanic Kaggle 数据集