使用滞后函数给出一个全零的原子向量

时间:2018-03-28 14:02:35

标签: r

我试图使用" lag"在基数R中起作用以计算6小时的降雨量累积。我有每小时的降雨量,然后我使用cumsum函数计算累积降雨量,然后我使用滞后函数计算6小时累积,如下所示。

Event_Data<-dbGetQuery(con, "select feature_id, TO_CHAR(datetime, 'MM/DD/YYYY HH24:MI') as DATE_TIME, value_ms as RAINFALL_IN from Rain_HOURLY")

Event_Data$cume<-cumsum(Event_Data$RAINFALL_IN)
Event_Data$six_hr<-Event_Data$cume-lag(Event_Data$cume, 6)

但滞后函数给了我所有的零,数据框的结构看起来像这样 -

'data.frame':   169 obs. of  5 variables:
 $ feature_id      : num  80 80 80 80 80 ...
 $ DATE_TIME  : chr  "09/10/2017 00:00" "09/10/2017 01:00" "09/10/2017 02:00" "09/10/2017 03:00" ...
 $ RAINFALL_IN: num  0.251 0.09 0.017 0.071 0.016 0.01 0.136 0.651 0.185 0.072 ...
 $ cume : num  0.251 0.341 0.358 0.429 0.445 ...
 $ six_hr : atomic  0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "tsp")= num  -23 145 1

这个代码在我的其他几个项目中运行良好,但我不知道为什么我会得到零。非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

可能与其他软件包中的lag函数存在冲突,这可以解释为什么此代码适用于其他脚本但不适用于此代码。

尝试stats::lag而非lag来强制执行您要使用的包。 (或dplyr::lag这似乎对我来说在东方更好?)

答案 1 :(得分:0)

我认为你对lag()包中stats的内容有误解。它返回零,因为您正在获取累积降雨量的完整数据,然后再次减去它。请查看此小例子以获取说明:

x <- 1:20
y <- lag(x,3) ;y
 #[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#attr(,"tsp")
#[1] -2 17  1
x-y     #x is a vector
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#attr(,"tsp")
#[1] -2 17  1

如您所见,lag()只保留矢量值,只添加时间序列属性,其值为“开始时间,结束时间,频率”。因为你放入一个向量,它使用默认值“1,length(Event_Data $ cume),1”并从开始和结束时间减去延迟,在示例中为3,在代码输出中似乎为24(其中不适合它上面的代码输入,顺便说一句。

问题是您的向量没有分配任何时间属性,因此R不知道您的数据和滞后数据的相应值是哪个。因此,它只是减去矢量值并添加滞后变量的时间属性。要解决此问题,您只需将时间分配给Event_Data$cume,方法是将其转换为时间序列对象,即尝试Event_Data$six_hr<-as.numeric(ts(Event_Data$cume) - lag(ts(Event_Data$cume), 6))

它适用于上面的小例子:

x <- ts(1:20)
y <- lag(x,3)
x-y     #x is a ts
#Time Series:
#Start = 1 
#End = 17 
#Frequency = 1 
# [1] -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3