【问题标题】:Grouping events in R that occur withing a given time frame/period对在给定时间范围/期间内发生的 R 中的事件进行分组
【发布时间】:2018-03-13 14:30:01
【问题描述】:

我目前正在使用 R。我有一个带有每小时时间戳的大型数据表,以及每小时的观察结果。我需要将所有在 4 小时内发生的 > 0 的观察结果分组为一个事件。示例数据如下:

Date            Obs
2017-12-01 5    0.01
2017-12-01 6    0.5
2017-12-01 7    0.2
2017-12-01 8    0
2017-12-01 9    0.03
2017-12-01 10   0.01
2017-12-01 11   0
2017-12-01 12   0
2017-12-01 13   0
2017-12-01 14   0
2017-12-01 15   0
2017-12-01 16   0
2017-12-01 17   0
2017-12-01 18   1.2
2017-12-01 19   0.6 

例如,前六行将是一个事件 (0.01, 0.5, 0.2, 0. 0.03, 0.01),因为只有一小时的非观察时间(零)。然后连续的 4 个零或更多的行将触发非事件。事件 2 将在下次我们得到正读数 (1.2, 0.6) 等时开始。

我尝试使用 rle() 函数来执行此操作。例如:

events <- rle(data$Obs > 0)

但是,这会为每个 0 创建一个非事件。有没有简单的解决方案?谢谢。

【问题讨论】:

  • 如果观察继续发生有增无减,组可以无限扩展吗?换句话说,它会通过在有 4 个连续“0”观察值的点上拆分事物来完成你想要的吗?如果没有,您可能正在寻找某种滚动窗口功能?
  • 我会说在 obs 字段中按 >0 和 0 分隔事件。然后使用来自这篇文章link 的 data.table() 在这种情况下可能会对您有所帮助。
  • @lemonC 感谢您的链接和建议,我没有考虑 data.table(),我认为该链接有一些有用的信息,我将来可以在这个项目中使用!

标签: r time-series timespan


【解决方案1】:

这是一个使用 data.table 表示法的解决方案,使用运行长度来确定区域是否足够长以拆分组:

library(data.table)
set.seed(120)

# Toy data set
dat <- data.table(time=seq(1,1000), obs=sample(c(0,0.01, 0.1, 1), size=1000, replace=TRUE, prob=c(0.3, 0.3, 0.3, 0.1)))

# calculate run lengths for the observation values
o <- rle(dat$obs)

# assign a new column assigning each row(timepoint/observation) its run length
dat[, length := unlist(lapply(o$lengths, function(x) rep(x, each=x)))]

# determine if the region should be considered an "interruption"
dat[, interrupt := ifelse(obs==0 & length>= 4, TRUE, FALSE)]

# assign values to each alternating interruption/grouped region
dat[, group := rleid(interrupt)]

# Remove sections with >= 4 obsevations of 0
dat2 <- dat[interrupt==FALSE]

# Re-number groups starting at 1
dat2[,group := as.numeric(as.factor(group))]

这应该给你你正在寻找的东西

time  obs length interrupt group
   1 0.00      2     FALSE     1
   2 0.00      2     FALSE     1
   3 0.01      1     FALSE     1
   4 1.00      1     FALSE     1
   5 0.01      1     FALSE     1

 992 0.10      1     FALSE     6
 993 0.00      1     FALSE     6
 994 0.01      1     FALSE     6
 995 0.00      1     FALSE     6
 996 0.10      1     FALSE     6

此时,您可以跟进您想对您的小组做的任何事情。例如按组计算平均值,

dat2[, list("average"=mean(obs)), by=group]

产量

group   average
    1 0.1391803
    2 0.1415838
    3 0.2582716
    4 0.1353086
    5 0.1011765
    6 0.1896774

【讨论】:

  • 谢谢。这似乎正是我需要的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 2014-07-23
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多