如何解决使用R,如何使用dplyr的超前和滞后函数从POSIXct变量中正确减去一秒钟? 数据
我在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
来代替case_when
,使用case_when
也可以有多个条件,而不是使用嵌套的ifelse
或if_else
library(dplyr)
library(lubridate)
df %>%
mutate(Time = as.POSIXct(Time),Time = case_when(Time == lead(Time) ~
Time - seconds(1),TRUE ~ 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
或者使用base R
,我们创建一个逻辑索引并分配
i1 <- c(df$Time[-1] == df$Time[-nrow(df)],FALSE)
df$Time <- as.POSIXct(df$Time)
df$Time[i1] <- df$Time[i1] - 1
数据
df <- structure(list(Time = c("2017-03-11 01:10:09","2017-03-11 03:07:58","2017-03-12 19:16:47","2017-03-13 09:52:04","2017-03-17 20:36:35","2017-03-18 03:10:54","2017-03-18 07:29:31","2017-03-18 10:13:37","2017-03-20 10:19:31","2017-03-20 12:11:39","2017-03-20 14:16:12")),class = "data.frame",row.names = c("1","2","3","4","5","6","7","8","9","10","11","12"))
,
您的方法是正确的,但是base::ifelse
剥去了POSIXct
列为数字的属性。为了避免这种情况,因为您正在使用dplyr
,所以可以使用dplyr::if_else
来保留该类。
还要注意,lead
将为NA
中的最后一个值生成Time
,因此比较Time == lead(Time)
将生成NA
。我们可以在missing
中将Time
自变量设置为if_else
。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。