R中每周每小时数据的高效简洁矢量转换

时间:2016-05-23 17:36:50

标签: r data-analysis

我有一个工作职能,但我希望有更简洁的方法来解决这个问题。

我有一个事件的数据集,这些事件是在它们发生的一周中捕获的。例如,周日凌晨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小时转换文件/数据。

干杯!

1 个答案:

答案 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