R中周-日-小时数据的高效简洁向量变换



我有一个工作函数,但我希望有一种更简洁的方法来实现这一点。

我有一个事件数据集,这些事件是根据一周中发生的时间捕获的。例如,周日凌晨4点=4,周一凌晨4点=28等。我想每天分析这些数据。例如,任何一天早上8点到10点之间发生的所有事件。

为了做到这一点,我构建了一个函数,它为有序列表的给定范围返回一个二分法值。函数two_break接受一个有序的整数列表,这些整数介于0:168之间,表示一周中的小时数,以及一天中24小时所需时段的范围(b1和b2)。b1和b2划分了所需的一天24小时的范围。即,如果b1=8并且b2=10,则two_break将返回9、(9+24)=33、(9+48)=57等的所有值作为1,并且所有其他值为0。

two_break <- function(test_hr,b1,b2){
test_hr<-ifelse(test_hr==1,1.1,test_hr)
for(i in 0:6){
test_hr<-ifelse(test_hr> (b1+24*i) & test_hr< (b2+24*i), 1 ,test_hr)
}
test_hr<-ifelse(test_hr==1,1,0)
return(test_hr)
}

这个功能很好用,但我想知道是否有人能更有效/简洁地完成它。

请参阅我的github:anthonyjp87 168小时转换文件/data中的完整代码和数据集。

干杯!

您可以使用整数除法%/%来捕获一周中的某一天,使用模数%%来捕获一天中的某个小时:

weekHours <- 1:168
# return the indices of all elements where the hour is between 8AM and 10AM, inclusive
test_hr <- weekHours[weekHours %% 24 %in% 8:10]

请注意,午夜由0表示。如果你想把它包装成一个函数,你可以使用

getTest_hr <- function(weekHours, startTime, stopTime) {
weekHours[weekHours %% 24 %in% seq(startTime, stopTime)]
}

要获得一周中的哪一天,您可以使用整数除法:

# get all indices for the third day of the week
dayOfWeek3 <- weekHours[(weekHours %/% 24 + 1) == 3]

要获得所选时间段的二进制矢量,只需从索引中提取逻辑:

allTimesBinary <- (weekHours %% 24) %in% 8:10    

最新更新