使用R,如何使用dplyr的超前和滞后函数从POSIXct变量中正确减去一秒?

使用R,如何使用dplyr的超前和滞后函数从POSIXct变量中正确减去一秒?,r,dplyr,lag,mutate,lead,R,Dplyr,Lag,Mutate,Lead,我在POSIXct格式的表格中有12个日期和时间: Time 1 2017-03-11 01:10:09 2 2017-03-11 03:07:58 3 2017-03-12 19:16:47 4 2017-03-13 09:52:04 5 2017-03-17 20:36:35 6 2017-03-18 03:10:54 7 2017-03-18 07:29:31 8 2017-03-18 10:13:37 9 2017-03-20 10:19

我在POSIXct格式的表格中有12个日期和时间:

                Time
1  2017-03-11 01:10:09
2  2017-03-11 03:07:58
3  2017-03-12 19:16:47
4  2017-03-13 09:52:04
5  2017-03-17 20:36:35
6  2017-03-18 03:10:54
7  2017-03-18 07:29:31
8  2017-03-18 10:13:37
9  2017-03-20 10:19:31
10 2017-03-20 12:11:39
11 2017-03-20 12:11:39
12 2017-03-20 14:16:12
如果一个条目与下面的条目匹配,我想从时间中删除一秒钟。例如,第10行应显示为2017-03-20 12:11:38

我正在尝试做以下类似的事情,但这是可行的:

df %>% mutate(Time = ifelse(Time == lead(Time), Time-1, Time))
当我们可以有多个条件而不是使用嵌套的ifelse或if_-else时,我们可以使用case_,而不是ifelse

-输出

#          Time
#1  2017-03-11 01:10:09
#2  2017-03-11 03:07:58
#3  2017-03-12 19:16:47
#4  2017-03-13 09:52:04
#5  2017-03-17 20:36:35
#6  2017-03-18 03:10:54
#7  2017-03-18 07:29:31
#8  2017-03-18 10:13:37
#9  2017-03-20 10:19:31
#10 2017-03-20 12:11:38
#11 2017-03-20 12:11:39
#12 2017-03-20 14:16:12
或者使用baser,我们创建一个逻辑索引并分配

i1 <- c(df$Time[-1]  == df$Time[-nrow(df)], FALSE)
df$Time <- as.POSIXct(df$Time)
df$Time[i1] <- df$Time[i1] - 1
数据 当我们可以有多个条件而不是使用嵌套的ifelse或if_-else时,我们可以使用case_,而不是ifelse

-输出

#          Time
#1  2017-03-11 01:10:09
#2  2017-03-11 03:07:58
#3  2017-03-12 19:16:47
#4  2017-03-13 09:52:04
#5  2017-03-17 20:36:35
#6  2017-03-18 03:10:54
#7  2017-03-18 07:29:31
#8  2017-03-18 10:13:37
#9  2017-03-20 10:19:31
#10 2017-03-20 12:11:38
#11 2017-03-20 12:11:39
#12 2017-03-20 14:16:12
或者使用baser,我们创建一个逻辑索引并分配

i1 <- c(df$Time[-1]  == df$Time[-nrow(df)], FALSE)
df$Time <- as.POSIXct(df$Time)
df$Time[i1] <- df$Time[i1] - 1
数据
但是,您的方法是正确的,base::ifelse去掉了使POSIXct列成为数字的属性。为了避免这种情况,因为您使用的是dplyr,所以可以使用保留类的dplyr::if_else

还请注意,lead将为时间上的最后一个值生成NA,因此比较时间==leadTime将生成NA。我们可以将缺少的参数设置为时间,如果没有


但是,您的方法是正确的,base::ifelse去掉了使POSIXct列成为数字的属性。为了避免这种情况,因为您使用的是dplyr,所以可以使用保留类的dplyr::if_else

还请注意,lead将为时间上的最后一个值生成NA,因此比较时间==leadTime将生成NA。我们可以将缺少的参数设置为时间,如果没有

代码高尔夫-Time-cdiffTime==0,0代码高尔夫-Time-cdiffTime==0,0
library(dplyr)
df %>% mutate(Time = if_else(Time == lead(Time), Time-1, Time, missing = Time))

#                  Time
#1  2017-03-11 01:10:09
#2  2017-03-11 03:07:58
#3  2017-03-12 19:16:47
#4  2017-03-13 09:52:04
#5  2017-03-17 20:36:35
#6  2017-03-18 03:10:54
#7  2017-03-18 07:29:31
#8  2017-03-18 10:13:37
#9  2017-03-20 10:19:31
#10 2017-03-20 12:11:38
#11 2017-03-20 12:11:39
#12 2017-03-20 14:16:12