我有一个工作职能,但我希望有更简洁的方法来解决这个问题。
我有一个事件的数据集,这些事件是在它们发生的一周中捕获的。例如,周日凌晨4点= 4点,周一凌晨4点= 28点等等。我想每天分析这些数据。例如,所有发生在任何一天上午8点到10点之间的事件。
为此,我构建了一个函数,该函数返回有序列表的给定范围的二分值。函数two_break接受0:168之间的整数的有序列表,表示一周的小时数和范围(b1和b2),表示24小时工作日的期望时段。 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小时转换文件/数据。
干杯!
答案 0 :(得分:1)
您可以使用整数除法%/%
来捕获星期几,使用模数%%
来捕获当天的小时:
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