【问题标题】:Finding average of values in the past 2 minutes in a data.table在 data.table 中查找过去 2 分钟内的平均值
【发布时间】:2015-09-14 21:31:57
【问题描述】:

我正在尝试在同一 data.table 中查找某个时间范围内的平均值并将其保存到新列中。

下面是一个样本数据集

更新了数据集以表示我原始数据集中的不连续时间线。

> x
                     ts value avg
 1: 2015-01-01 00:00:23     9   0
 2: 2015-01-01 00:01:56    11   0
 3: 2015-01-01 00:02:03    18   0
 4: 2015-01-01 00:03:16     1   0
 5: 2015-01-01 00:05:19     6   0
 6: 2015-01-01 00:05:54    16   0
 7: 2015-01-01 00:06:27    13   0
 8: 2015-01-01 00:06:50     7   0
 9: 2015-01-01 00:08:41    12   0
10: 2015-01-01 00:09:08    17   0
11: 2015-01-01 00:09:28     8   0
12: 2015-01-01 00:10:56     5   0
13: 2015-01-01 00:11:44    10   0
14: 2015-01-01 00:12:23    20   0
15: 2015-01-01 00:12:28     2   0
16: 2015-01-01 00:12:37    15   0
17: 2015-01-01 00:12:42     4   0
18: 2015-01-01 00:12:48    19   0
19: 2015-01-01 00:13:41     3   0
20: 2015-01-01 00:16:04    14   0

我的代码将值 10.5 分配给所有行,但我没有得到预期的结果。这是我的代码。

require(lubridate)
x[, avg :=  x[ts>=ts-minutes(2) & ts<=ts , mean(value)], verbose=TRUE  ]

更新

我希望结果如下

                   ts   value   avg
1   01-01-2015 00:00:23 9   0
2   01-01-2015 00:01:56 11  9
3   01-01-2015 00:02:03 18  10
4   01-01-2015 00:03:16 1   14.5
5   01-01-2015 00:05:19 6   0
6   01-01-2015 00:05:54 16  6
7   01-01-2015 00:06:27 13  11
8   01-01-2015 00:06:50 7   11.66666667
9   01-01-2015 00:08:41 12  7
10  01-01-2015 00:09:08 17  12
11  01-01-2015 00:09:28 8   14.5
12  01-01-2015 00:10:56 5   12.5
13  01-01-2015 00:11:44 10  5
14  01-01-2015 00:12:23 20  7.5
15  01-01-2015 00:12:28 2   11.66666667
16  01-01-2015 00:12:37 15  9.25
17  01-01-2015 00:12:42 4   10.4
18  01-01-2015 00:12:48 19  9.333333333
19  01-01-2015 00:13:41 3   11.666667
20  01-01-2015 00:16:04 14  0

我想对具有更大数据集的数据执行此操作,并且在单独的列中分别包含最小值和最大值(这里我只显示了平均函数)。任何帮助都会很棒。

更新

下面是可重现的代码。

#reproducible code
ts<-  seq(from=ISOdatetime(2015,1,1,0,0,0,tz="GMT"),to=ISOdatetime(2015,1,1,0,0,19,tz="GMT"), by="sec")
set.seed(2)
ts <-ts + seconds(round(runif(20,0,1000),0))
value <- 1:20
avg <- 0
x <- data.table(ts,value,avg)  
setkey(x,ts)
x

解决方案

感谢@Saksham 指点我应用函数。这是我想出的解决方案。

find <- function(y){
  mean(x[ts>=y-minutes(2) & ts<y,value])
}
x$avg <- mapply(find,x[,ts])
> x
                     ts value       avg
 1: 2015-01-01 00:00:23     9       NaN
 2: 2015-01-01 00:01:56    11  9.000000
 3: 2015-01-01 00:02:03    18 10.000000
 4: 2015-01-01 00:03:16     1 14.500000
 5: 2015-01-01 00:05:19     6       NaN
 6: 2015-01-01 00:05:54    16  6.000000
 7: 2015-01-01 00:06:27    13 11.000000
 8: 2015-01-01 00:06:50     7 11.666667
 9: 2015-01-01 00:08:41    12  7.000000
10: 2015-01-01 00:09:08    17 12.000000
11: 2015-01-01 00:09:28     8 14.500000
12: 2015-01-01 00:10:56     5 12.500000
13: 2015-01-01 00:11:44    10  5.000000
14: 2015-01-01 00:12:23    20  7.500000
15: 2015-01-01 00:12:28     2 11.666667
16: 2015-01-01 00:12:37    15  9.250000
17: 2015-01-01 00:12:42     4 10.400000
18: 2015-01-01 00:12:48    19  9.333333
19: 2015-01-01 00:13:41     3 11.666667
20: 2015-01-01 00:16:04    14       NaN

【问题讨论】:

  • 你可以试试library(RcppRoll);x[, Avg:=c(value[1L],roll_mean(value,2))]
  • @akrun 我的实际数据集在不同的行中有多个“值”,用于不同的分钟/秒组合。所以在那种情况下,当我想在 2 分钟内找到所有值的平均值时,我可能需要动态查看两行以上。所以我需要一些可以指定时间范围的东西。
  • 如果你的所有行都包含严格等距时间戳的数据,你可以使用{zoo}库中的rollmean()(还有rollmax、rollmin等函数)
  • @MaksimGayduk roll_mean from RcppRoll 要快得多。
  • 让您的示例代表您的问题/真实数据集。

标签: r data.table analytics


【解决方案1】:

这样可以吗

ts[,avg] <- ts[,val] - 0.5

从逻辑上看,看到您的预期结果,它正在做同样的事情。如果我的解释有误,您可以编辑您的预期结果以使其更加灵活。

编辑:

这种基本的 R 方法应该可以解决问题。由于我不熟悉操纵时间,因此我假设算术的工作方式与大多数语言中的工作方式相同

interval <- minutes(2) #Assuming this is how we define 5 minutes

x$avg <- apply( x, 1, function(y){
               mean(x$value[x$time > ( y["time"]) - interval ) && x$time < y["time"]])
               })

【讨论】:

  • 我的数据集只是一个例子。在这种情况下,我的预期结果恰好可以通过简单的减法来实现。但是,我希望能够在给定时间范围内取平均值,以供我在现实生活中使用。
  • 您似乎根本没有在任何地方使用“值”列。仅供参考 - 您可以使用 lubridate 包中的 interval
  • @pauljeba。抱歉,我是R 的初学者。你能现在验证吗
  • 感谢您为我指明了应用函数的方向。你的给出了这个想法,我能够找出完整的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2021-05-19
相关资源
最近更新 更多