在R中输入日期和时间
我有一个如下所示的数据集,我正试图估算如下所示的值在R中输入日期和时间,r,dplyr,R,Dplyr,我有一个如下所示的数据集,我正试图估算如下所示的值 ID In Out 4 2019-09-20 21:57:22 NA 4 NA 2019-09-21 5:07:03 当每个ID都有NA的超前和滞后时,我试图估算出前一天的截止时间和第二天的新时间。我是这样做的,但我有错误 df1%>% group_by(ID) %>% mutate(In= ifelse(is.n
ID In Out
4 2019-09-20 21:57:22 NA
4 NA 2019-09-21 5:07:03
当每个ID都有NA的超前和滞后时,我试图估算出前一天的截止时间和第二天的新时间。我是这样做的,但我有错误
df1%>%
group_by(ID) %>%
mutate(In= ifelse(is.na(In) & is.na(lag(Out)),
as.POSIXct(as.character(paste(as.Date(In),"05:00:01"))),
In)) %>%
mutate(Out= ifelse(is.na(Out) & lead(In) == "05:00:01",
as.POSIXct(as.character(paste(as.Date(Out),"05:00:00"))),
Out))
所需的输出将是
ID In Out
4 2019-09-20 21:57:22 2019-09-21 05:00:00
4 2019-09-21 5:00:01 2019-09-21 5:07:03
数据的Dput
structure(list(concat = c("176 - 2019-09-20", "176 - 2019-09-20",
"176 - 2019-09-20", "176 - 2019-09-20", "176 - 2019-09-21"),
ENTRY = structure(c(1568989081, 1569008386, 1569016635, 1569016646,
NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), EXIT = structure(c(1569005439,
1569014914, 1569016645, NA, 1569042433), class = c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, -5L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x0000000007e21ef0>)
结构(列表(concat=c(“176-2019-09-20”、“176-2019-09-20”),
"176 - 2019-09-20", "176 - 2019-09-20", "176 - 2019-09-21"),
入口=结构(c,
NA),类=c(“POSIXct”,“POSIXt”),tzone=“UTC”),出口=结构(c(1569005439,
1560104914,1560106645,NA,156042433),类=c(“POSIXct”,
“POSIXt”)、tzone=“UTC”)、row.names=c(NA,-5L)、class=c(“data.table”,
“data.frame”),.internal.selfref=)
最后,我通过分离日期和时间并将其粘贴回来,获得了所需的输出。显然,这不是实现这一目标的有效方法。也许有人可以建议其他有效的方法来做这件事,这至少给了一些学习
df%>%
mutate(ENTRY_date = as.Date(ENTRY)) %>%
mutate(EXIT_date = as.Date(EXIT))%>%
mutate(ENTRY_time = format(ENTRY,"%H:%M:%S"))%>%
mutate(EXIT_time = format(EXIT,"%H:%M:%S"))%>%
mutate(Entry_date1 = if_else(is.na(ENTRY_date)&is.na(lag(EXIT_date)),EXIT_date,ENTRY_date))%>%
mutate(Exit_date1 = if_else(is.na(EXIT_date)& is.na(lead(ENTRY_date)),ENTRY_date,EXIT_date))%>%
mutate(Entry_time1 = if_else(is.na(ENTRY_time)&is.na(lag(EXIT_time)),"05:00:01",ENTRY_time))%>%
mutate(Exit_time1 = if_else(is.na(EXIT_time)& is.na(lead(ENTRY_time)),"04:59:59",EXIT_time))%>%
mutate(ENTRY1 = as.POSIXct(paste(Entry_date1, Entry_time1), format = "%Y-%m-%d %H:%M:%S"))%>%
mutate(EXIT1 = as.POSIXct(paste(Exit_date1, Exit_time1), format = "%Y-%m-%d %H:%M:%S"))
首先,使用
dput()
数据对我不起作用。无论如何,如果我正确理解你的问题,你可以这样做:
# load pacakge
library(lubridate)
# replace missing In values with the corresponding Out values,
# setting 5:00:01 as time.
df$In[is.na(df$In)] <- ymd_hms(paste0(as.Date(df$Out[is.na(df$In)]), " 5:00:01"))
# same idea but first we save it as a vector...
Out <- ymd_hms(paste0(as.Date(df$In[is.na(df$Out)]), " 5:00:00"))
# ... then we add one day
day(Out) <- day(Out) + 1; df$Out[is.na(df$Out)] <- Out
你能详细说明一下吗?您想只在上午5点自动执行流程还是参考?你能提供一个更大的可复制的例子吗?谢谢你,不要自动化。参考只是将前一天的时间缩短为上午5点,第二天的时间从上午5:00:01开始
structure(list(In = structure(c(1569016642, NA), tzone = "UTC", class = c("POSIXct",
"POSIXt")), Out = structure(c(NA, 1569042423), tzone = "UTC", class = c("POSIXct",
"POSIXt"))), .Names = c("In", "Out"), row.names = c(NA, -2L), class = "data.frame")