的R - 对时间变量和日期条件操作(R - Conditional operations on t

2019-10-29 23:13发布

假设,我有以下数据帧和想要做的最后一个变量一些操作HMS 。 其目的是创建一个新的变量,可以说TimeStampNew第二天如果分配的观察之后17:30:00一天。 当观察表示没有的值( 'NA' ),则TimeStamp应该使用相同的日期的。

问题是,在转换HMS -variable从阶级性的格式允许的条件。 我已经检查了克隆氏病级封装或将其转换为类型的对象POSIXct作为可能的替代方案。

类似的问题我已经问这个帖子: 的R -条件对字符变量“平日”,并在数据帧特殊的“日期”代替 。 我已经尝试过用一些操作来解决问题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

Answer 1:

使用difftimeifelse语句:

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


Answer 2:

假设DF如在结尾处注释显示重复性。 特别是TimestampHMS都假定为字符列。 Timestamp可以交替是一个"Date"类列。

下面的代码替换其NAHMS柱,用"00:00:00" ,并增加了1天到的TimeStamp (将其转换成之后"Date" ,如果类) 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)


文章来源: R - Conditional operations on time variables and dates