基于HH:MM:SS格式列的数据帧的条件子集

时间:2014-07-21 19:56:04

标签: r dataframe subset

所以我有一个大型df,其中包含一个名为“session”的列,格式为         HH:MM:SS(例如0:35:24,35分钟和24秒)。

我想基于类似&gt;的条件创建df的子集2分钟或<2分钟距“会议”栏目90分钟

我尝试先将列格式转换为日期:

    df$session <- as.Date(df$session, "%h/%m/%s")

然后我将使用subset()创建我的条件子集,但上面的代码会生成一列NA。

    subset.morethan2min <-subset(df, CONDITION) 

其中CONDITION是df $ session&gt; 2分钟?

我应该如何操纵“会话”列,以便能够如上所述对条件进行子集化?

对不起R非常新,所以欢迎任何建议。

谢谢!

更新:

我将会话列转换为POSIXct,然后使用lubridate包中的函数minute()来获取小时和分钟组件的数值。不是一个近乎解决方案,但似乎现在满足我的需求。尽管如此,仍然欢迎更简洁的解决方案。

    df$sessionPOSIX <- as.POSIXct(strptime(df$session, "%H:%M:%S"))

    df$minute <- minute(df$sessionPOSIX)

    subset.morethan2min <- subset(df, minute > 2)

2 个答案:

答案 0 :(得分:1)

日期与期间不同。处理句点的最简单方法是使用lubridate包:

library(lubridate)

df$session <- hms(df$session)

df.morethan2min <- subset(df, df$session > period(2, 'minute'))

hms()将持续时间标记转换为句点对象,period()创建指定长度的句点对象以进行比较。

除此之外,还有许多其他方法可以对数据框进行分组,包括[运算符和filter()包中的dplyr等函数,但这超出了您的需要目前的目的。

答案 1 :(得分:0)

可能更简单的方法,但这是一个解决方案:

set.seed(1234)
tDF <- data.frame(
  Val = rnorm(100),
  Session = paste0(
    sample(0:23,100,replace=TRUE),
    ":",
    sample(0:59,100,replace=TRUE),
    ":",
    sample(0:59,100,replace=TRUE),
    sep="",collapse=NULL),
  stringsAsFactors=FALSE
)
##
toSec <- function(hms){
  Long <- as.POSIXct(
    paste0(
      "2013-01-01 ",
      hms),
    format="%Y-%m-%d %H:%M:%S",
    tz="America/New_York")
  3600*as.numeric(substr(Long,12,13))+
    60*as.numeric(substr(Long,15,16))+
    as.numeric(substr(Long,18,19))
}
##
tDF <- cbind(
  tDF,
  Seconds = toSec(tDF$Session),
  Minutes = toSec(tDF$Session)/60
)
##
> head(tDF)
         Val  Session Seconds   Minutes
1 -1.2070657 15:21:41   55301  921.6833
2  0.2774292 12:58:24   46704  778.4000
3  1.0844412  7:32:45   27165  452.7500
4 -2.3456977 18:26:46   66406 1106.7667
5  0.4291247 12:56:34   46594  776.5667
6  0.5060559 17:27:11   62831 1047.1833

然后,您可以通过subset(Data, Minutes > some_number)轻松实现数据的子集化。