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

Efficient and Succinct Vector Transformation of Weekly to Daily hourly Data in R

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

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

为此,我构建了一个函数,该函数 return 为有序列表的给定范围提供二分值。函数 two_break 接受 0:168 之间的有序整数列表,表示一周中的小时数和一天 24 小时所需时间段的范围(b1 和 b2)。 b1 和 b2 划分所需的 24 小时制范围。即,如果 b1=8 和 b2=10 two_break 将 return 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)
}

这个功能很好用,但我想知道是否有人可以做得更好 efficiently/succinctly。

在我的 github 查看完整代码和数据集:anthonyjp87 168 小时转换 file/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