R随时间变化的超前和滞后(移位)

R随时间变化的超前和滞后(移位),r,time,lag,shift,lead,R,Time,Lag,Shift,Lead,我尝试在数据帧的一列上使用滞后,但当涉及到时间时,它就是不起作用。我试过换档、滞后和tlag 例如: y = strptime(sprintf("%s:%s:%s", 4, 20, 10), "%H:%M:%S") yy = strptime(sprintf("%s:%s:%s", 10, 20, 10), "%H:%M:%S") lag(c(y,yy)) 格式错误。POSIXlt(x,usetz=usetz): “POSIXlt”中的无效组件[[10]]应为“区域” tlag(c(y,yy)

我尝试在数据帧的一列上使用滞后,但当涉及到时间时,它就是不起作用。我试过换档、滞后和tlag

例如:

y = strptime(sprintf("%s:%s:%s", 4, 20, 10), "%H:%M:%S")
yy = strptime(sprintf("%s:%s:%s", 10, 20, 10), "%H:%M:%S")
lag(c(y,yy))
格式错误。POSIXlt(x,usetz=usetz): “POSIXlt”中的无效组件[[10]]应为“区域”

tlag(c(y,yy))

n_distinct_multi(列表(…),na.rm中出错: 缺少参数“time”,没有默认值

我不想要任何时间差,我只想要数据框中上面一行的值,我认为这就是lag所做的:“超前和滞后对于比较由常数(例如,前一个或下一个值)偏移的值很有用”。 时间应该无关紧要,它应该从上一个位置选择任何数字/字符/时间。我该如何解决这个问题,或者是否有一个不同的函数可以实现我想要的功能-我不想涉及任何循环,因为速度很重要,数据帧也很大

来自我的数据帧的示例:

structure(list(sec = c(52, 53, 54, 55, 56, 57, 58, 59, 0, 1), 
    min = c(50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 51L, 51L), 
    hour = c(11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L
    ), mday = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), mon = c(6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), year = c(117L, 117L, 
    117L, 117L, 117L, 117L, 117L, 117L, 117L, 117L), wday = c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), yday = c(184L, 184L, 
    184L, 184L, 184L, 184L, 184L, 184L, 184L, 184L), isdst = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), zone = c("BST", "BST", 
    "BST", "BST", "BST", "BST", "BST", "BST", "BST", "BST"), 
    gmtoff = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_)), .Names = c("sec", "min", "hour", "mday", "mon", 
"year", "wday", "yday", "isdst", "zone", "gmtoff"), class = c("POSIXlt", 
"POSIXt"))

对于
数据帧
如下

  index                time
1     1 2017-07-04 04:20:10
2     2 2017-07-04 10:20:10
您可以使用
dplyr

dplyr::lag(df$time, 1)
[1] NA                         "2017-07-04 04:20:10 CEST"

dplyr::lead(df$time, 1)
[1] "2017-07-04 10:20:10 CEST" NA         
要将超前/滞后列添加到
data.frame
中,可以使用

dplyr::mutate(df, lead_1 = dplyr::lead(time, 1), lag_1 = dplyr::lag(time, 1))
  index                time              lead_1               lag_1
1     1 2017-07-04 04:20:10 2017-07-04 10:20:10                <NA>
2     2 2017-07-04 10:20:10                <NA> 2017-07-04 04:20:10          
dplyr::mutate(df,lead_1=dplyr::lead(time,1),lag_1=dplyr::lag(time,1))
索引时间超前1滞后1
1     1 2017-07-04 04:20:10 2017-07-04 10:20:10                
2     2 2017-07-04 10:20:10                 2017-07-04 04:20:10          

用于
数据帧
如下

  index                time
1     1 2017-07-04 04:20:10
2     2 2017-07-04 10:20:10
您可以使用
dplyr

dplyr::lag(df$time, 1)
[1] NA                         "2017-07-04 04:20:10 CEST"

dplyr::lead(df$time, 1)
[1] "2017-07-04 10:20:10 CEST" NA         
要将超前/滞后列添加到
data.frame
中,可以使用

dplyr::mutate(df, lead_1 = dplyr::lead(time, 1), lag_1 = dplyr::lag(time, 1))
  index                time              lead_1               lag_1
1     1 2017-07-04 04:20:10 2017-07-04 10:20:10                <NA>
2     2 2017-07-04 10:20:10                <NA> 2017-07-04 04:20:10          
dplyr::mutate(df,lead_1=dplyr::lead(time,1),lag_1=dplyr::lag(time,1))
索引时间超前1滞后1
1     1 2017-07-04 04:20:10 2017-07-04 10:20:10                
2     2 2017-07-04 10:20:10                 2017-07-04 04:20:10          

最好发布一个包含文本中提到的数据框的可复制示例。我的怀疑是,你想做的是使用突变和滞后的tidyverse方法,非常直接,但目前很难看到。预期的输出是什么?数据帧的作用与上面的向量相同,它显示的是一个错误,而不是预期的“NA”,2017-07-04 04:20:10英国夏令时'在使用
data.frame
s时,始终将时间变量转换为
POSIXct
data.frame
无法很好地处理
POSIXlt
,因为它本质上是一个列表
strtime
确实返回
POSIXlt
。谢谢,这很有效。为什么/如何在不进行任何类转换的情况下解决以下问题?最好发布一个包含文本中提到的数据框的可复制示例。我的怀疑是,你想做的是使用突变和滞后的tidyverse方法,非常直接,但目前很难看到。预期的输出是什么?数据帧的作用与上面的向量相同,它显示的是一个错误,而不是预期的“NA”,2017-07-04 04:20:10英国夏令时'在使用
data.frame
s时,始终将时间变量转换为
POSIXct
data.frame
无法很好地处理
POSIXlt
,因为它本质上是一个列表
strtime
确实返回
POSIXlt
。谢谢,这很有效。为什么/如何在不进行任何类转换的情况下实现下面的答案?为什么使用POSIXlt可以在内部进行mutate,但没有mutate,我必须转换为POSIXct?为什么使用POSIXlt可以在内部进行mutate,但没有mutate,我必须转换为POSIXct?