r语言 - 观测值在特定时间范围内是否唯一



我正在尝试清理R中的数据集(下面的子样本(

通过 if

函数尽可能解释 if 的最佳方法:

如果航拍 = 1,则在此时间戳之前的 5 分钟内是否有另一个观测值?如果是这样,请给出真/假

但是我不确定如何做到这一点

               Date.Time Aerial
794  2012-10-01 08:18:00      1
795  2012-10-01 08:34:00      1
796  2012-10-01 08:39:00      1
797  2012-10-01 08:42:00      1
798  2012-10-01 08:48:00      1
799  2012-10-01 08:54:00      1
800  2012-10-01 08:58:00      1
801  2012-10-01 09:04:00      1
802  2012-10-01 09:05:00      1
803  2012-10-01 09:11:00      1
1576 2012-10-01 09:17:00      2
1577 2012-10-01 09:18:00      2
804  2012-10-01 09:19:00      1
805  2012-10-01 09:20:00      1
1580 2012-10-01 09:21:00      2
1581 2012-10-01 09:23:00      2
806  2012-10-01 09:25:00      1
807  2012-10-01 09:32:00      1
808  2012-10-01 09:37:00      1
809  2012-10-01 09:43:00      1

例如,在 09:19 空中 = 1 在这之前的 5 分钟内,在 09:18 和 09:17 有一个观测值,因此我想在 09:19 删除观测值。 这是大型数据集,因此可能会多次发生

如果这不是对R来说相对较新的正确方式,请道歉。

我的想法:

使用 if.else 语句,但是我无法获得日期时间来使用它。

在上面问这个问题之前,没有代码,因为一直在兜圈子试图这样做

d<-read.table(text='Date.Time Aerial
794  "2012-10-01 08:18:00"      1
795  "2012-10-01 08:34:00"      1
796  "2012-10-01 08:39:00"      1
797  "2012-10-01 08:42:00"      1
798  "2012-10-01 08:48:00"      1
799  "2012-10-01 08:54:00"      1
800  "2012-10-01 08:58:00"      1
801  "2012-10-01 09:04:00"      1
802  "2012-10-01 09:05:00"      1
803  "2012-10-01 09:11:00"      1
1576 "2012-10-01 09:17:00"      2
1577 "2012-10-01 09:18:00"      2
804  "2012-10-01 09:19:00"      1
805  "2012-10-01 09:20:00"      1
1580 "2012-10-01 09:21:00"      2
1581 "2012-10-01 09:23:00"      2
806  "2012-10-01 09:25:00"      1
807  "2012-10-01 09:32:00"      1
808  "2012-10-01 09:37:00"      1
809  "2012-10-01 09:43:00"      1', header=TRUE, stringsAsFactors=FALSE, row.names=1)
# convert Date.Time to POSIXct
d<-within(d, Date.Time<-as.POSIXct(Date.Time))

# define row aggregator 
f <- function(accumulation, next.row, min.mins=5) {
    last.dtime <- tail(accumulation,1)$Date.Time
    next.dtime <- next.row$Date.Time
    # don't add next.row if Aerial is 1 and time between last record is less than min.mins
    if (next.row$Aerial == 1 & (as.numeric(next.dtime - last.dtime, units='mins') < min.mins))
        accumulation
    else
        rbind(accumulation, next.row)
}
# aggregate rows
Reduce(f, split(d[order(d$Date.Time), ], sequence(nrow(d))))
#                Date.Time Aerial
# 794  2012-10-01 08:18:00      1
# 795  2012-10-01 08:34:00      1
# 796  2012-10-01 08:39:00      1
# 798  2012-10-01 08:48:00      1
# 799  2012-10-01 08:54:00      1
# 801  2012-10-01 09:04:00      1
# 803  2012-10-01 09:11:00      1
# 1576 2012-10-01 09:17:00      2
# 1581 2012-10-01 09:23:00      2
# 807  2012-10-01 09:32:00      1
# 808  2012-10-01 09:37:00      1
# 809  2012-10-01 09:43:00      1

>diff将为您提供特定数据列的"运行差异"。如果您在Date.Time上运行diff(如果它还没有采用该格式,则as.POSIXct(Date.Time)(,它会告诉您每个连续间隔之间的差异。所以看看结果

diff(DataFrame$Date.Time) #or
diff(as.POSIXct(DataFrame$Date.Time)) #if the first one doesn't work

如果您同意使用包并远离base函数,rollapply ,如@AriBFriedman所述,允许您更进一步diff并根据滚动值应用函数(它是zoo包的一部分(。

 with( dfrm, Aerial == 1 & c(diff(Date.Time),0) > 5 )
 [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE
[12] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE

这实际上只是处理差异的一个方向,无论如何,您是否希望包含末端的项目是一个悬而未决的问题。如果您想在两个方向上都这样做,那么可以正确设置一个额外的逻辑&子句来处理rev( diff (rev (Date.Time) ) )。我承认我想知道它的差异。POSIXt正在重新计算几分钟或秒。帮助页面没有帮助,测试显示它在几分钟内。

获得向后差异的另一种方法可能是使用以另一种方式移动的差异向量进行测试:

with( dfrm,  c( FALSE, abs(diff(Date.Time)) > 5 ) )

相关内容

  • 没有找到相关文章

最新更新