【问题标题】:Conditional subsetting of data frame based on HH:MM:SS formatted column基于 HH:MM:SS 格式化列的数据框条件子集
【发布时间】:2016-03-14 20:27:58
【问题描述】:

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

我想根据“会话”列中 > 2 分钟或

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

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

然后我打算使用子集()来创建我的条件子集,但上面的代码生成了一列 NA。

    subset.morethan2min <-subset(df, CONDITION) 

哪里 CONDITION 是 df$session >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)

【问题讨论】:

  • 真的是“约会”吗?似乎as.Date 可能不是您想要的功能。请参阅?DateTimeClasses,因为我没有完全了解 R 中的日期和时间

标签: r dataframe subset


【解决方案1】:

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

library(lubridate)

df$session <- hms(df$session)

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

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

顺便说一句,还有许多其他方法可以对数据帧进行子集化,包括[ 运算符和dplyr 包中的filter() 之类的函数,但这超出了您当前用途的需要。

【讨论】:

  • 这比我尝试做的要容易得多。谢谢!
【解决方案2】:

执行此操作的方法可能更简单,但这里有一个解决方案:

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 &gt; some_number) 轻松地对数据进行子集化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2019-06-01
    相关资源
    最近更新 更多