【发布时间】:2018-09-11 22:34:03
【问题描述】:
library(data.table)
library(lubridate)
df <- data.table(col1 = c('A', 'A', 'A', 'B', 'B', 'B'), col2 = c("2015-03-06 01:37:57", "2015-03-06 01:39:57", "2015-03-06 01:45:28", "2015-03-06 02:31:44", "2015-03-06 03:55:45", "2015-03-06 04:01:40"))
对于每一行,我想计算具有相同 'col1' 值的行的时间标准偏差(col2)和该行时间之前过去 10 分钟窗口内的时间(包括)
我使用下一种方法:
df$col2 <- as_datetime(df$col2)
gap <- 10L
df[, feat1 := .SD[.(col1 = col1, t1 = col2 - gap * 60L, t2 = col2)
, on = .(col1, col2 >= t1, col2 <= t2)
, .(sd_time = sd(as.numeric(col2))), by = .EACHI]$sd_time][]
结果我只看到 NA 值而不是几秒钟内的值
例如对于第三行(col="A" and col2 = "2015-03-06 01:45:28") 我已经通过下一种方式手动计算:
v <- c("2015-03-06 01:37:57", "2015-03-06 01:39:57", "2015-03-06 01:45:28")
v <- as_datetime(v)
sd(v) = 233.5815
【问题讨论】:
-
sd应用于长度为 1 的向量是NA您的粒度使得所有日期向量的长度为 1。 -
Max Ft,在很多情况下你是对的,但是对于 col1='A' 和 col2 = "2015-03-06 01:45:28" 你错了,对于这一行也是 NA,所以我认为需要修改data.table请求
-
基于 my answer 到您之前的问题,您可以这样做:
df[.(col1 = col1, t1 = col2 - gap * 60L, t2 = col2), on = .(col1, col2 >= t1, col2 <= t2)][, .(feat1 = sd(as.numeric(col2))), .(col1, col2.1)],但这不会给您带来有意义的答案,因为它要么返回NA,因为您无法计算 @ 987654329@ 一个数字(如@MaxFt 所说)或0因为当您有多个值时,它们将是相同的。 -
@Jaap,你错了 - 请分析 col1='A' 和 col2 = "2015-03-06 01:45:28" 的行的手动计算:v
标签: r data.table