假设我有下面的数据框,并希望对最后一个变量HMS
进行一些操作。
目的是创建一个新变量,比如TimeStampNew
,如果观察时间是17:30:00
之后,则指定第二天。当观察结果表明没有值('NA'
)时,应使用相同日期的TimeStamp
。
问题是,以允许条件的格式从类字符转换HMS
- 变量。我已经检查了chron-package或将其转换为POSIXct
类型的对象作为可能的替代方案。
我在这篇文章中提到的类似问题:R - Condition on character variable "weekday" and replace with special "date" in a data frame。
我已经尝试使用上面提到的帖子中建议的dplyr
包的某些操作来解决问题。但是,由于棘手的时间格式,我没有收到所需的解决方案。
是否有人对此问题提出解决方案建议?!
提前致谢!
TimeStamp HMS
1 2010-02-22 19:55:00
2 2012-10-10 07:53:00
3 2012-10-24 07:55:00
4 2013-07-15 08:14:00
5 2013-07-24 08:23:00
6 2013-12-02 10:00:00
7 2012-02-23 07:56:00
8 2012-03-06 08:45:00
9 2013-09-15 19:54:00
10 2007-03-28 NA
11 2007-08-09 NA
12 2008-08-07 NA
答案 0 :(得分:1)
使用difftime
和ifelse
声明:
df1$TimeStamp <- as.Date(df1$TimeStamp, format = "%Y-%m-%d")
df1$TimeStampNew <- ifelse(
difftime(as.POSIXct(df1$HMS, format = "%H:%M:%S"),
as.POSIXct("17:30:00", format = "%H:%M:%S")) > 0,
as.character(df1$TimeStamp + 1),
as.character(df1$TimeStamp))
df1$TimeStampNew[is.na(df1$HMS)] <- as.character(df1$TimeStamp[is.na(df1$HMS)])
它产生的数据帧:
> df1
TimeStamp HMS TimeStampNew
1 2010-02-22 19:55:00 2010-02-23
2 2012-10-10 07:53:00 2012-10-10
3 2012-10-24 07:55:00 2012-10-24
4 2013-07-15 08:14:00 2013-07-15
5 2013-07-24 08:23:00 2013-07-24
6 2013-12-02 10:00:00 2013-12-02
7 2012-02-23 07:56:00 2012-02-23
8 2012-03-06 08:45:00 2012-03-06
9 2013-09-15 19:54:00 2013-09-16
10 2007-03-28 <NA> 2007-03-28
11 2007-08-09 <NA> 2007-08-09
12 2008-08-07 <NA> 2008-08-07
答案 1 :(得分:1)
假设DF
在最后的注释中可重复显示。特别是Timestamp
和HMS
都被认为是字符列。 Timestamp
可以替代为"Date"
类列。
下面的代码将NA
列中的HMS
值替换为"00:00:00"
,并在TimeStamp
(将其转换为"Date"
类后)添加1天HMS
已过了17:30。
transform(DF, Date =
as.Date(TimeStamp) + (replace(HMS, is.na(HMS), "00:00:00") > "17:30:00"))
将此数据框提供给新的Date
列属于"Date"
类。
TimeStamp HMS Date
1 2010-02-22 19:55:00 2010-02-23
2 2012-10-10 07:53:00 2012-10-10
3 2012-10-24 07:55:00 2012-10-24
4 2013-07-15 08:14:00 2013-07-15
5 2013-07-24 08:23:00 2013-07-24
6 2013-12-02 10:00:00 2013-12-02
7 2012-02-23 07:56:00 2012-02-23
8 2012-03-06 08:45:00 2012-03-06
9 2013-09-15 19:54:00 2013-09-16
10 2007-03-28 <NA> 2007-03-28
11 2007-08-09 <NA> 2007-08-09
12 2008-08-07 <NA> 2008-08-07
输入DF
,可重复的形式:
Lines <- "
TimeStamp HMS
1 2010-02-22 19:55:00
2 2012-10-10 07:53:00
3 2012-10-24 07:55:00
4 2013-07-15 08:14:00
5 2013-07-24 08:23:00
6 2013-12-02 10:00:00
7 2012-02-23 07:56:00
8 2012-03-06 08:45:00
9 2013-09-15 19:54:00
10 2007-03-28 NA
11 2007-08-09 NA
12 2008-08-07 NA"
DF <- read.table(text = Lines, as.is = TRUE)