所以我有一个大型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)
答案 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)
轻松实现数据的子集化。