@@ -3,11 +3,36 @@ mergeFitbitData = function(filenames = NULL, desiredtz = "", configtz = NULL) {
33 stop(" Provide at least two filenames" )
44 }
55 cnt = 1
6+
7+ # change order filenames such that
8+ # heart rate if present is at the end, because heart rate
9+ # has irregular epoch length and needs to be interpolated
10+ filenames = filenames [c(grep(pattern = " sleep" , x = basename(filenames ), invert = FALSE ),
11+ grep(pattern = " calories" , x = basename(filenames ), invert = FALSE ),
12+ grep(pattern = " step" , x = basename(filenames ), invert = FALSE ),
13+ grep(pattern = " heart" , x = basename(filenames ), invert = FALSE ))]
14+
615 while (cnt < = length(filenames )) {
716 D = readFitbit(filename = filenames [cnt ], desiredtz = desiredtz , configtz = configtz )
817 if (cnt == 1 ) {
918 data = D
1019 } else {
20+ if (length(grep(" heart" , x = colnames(D ))) > 0 ) {
21+ # interpolate heart rate to 30 seconds to ease merging with
22+ # other data types
23+ t0 = round(as.numeric(D $ dateTime [1 ]) / 30 ) * 30
24+ t1 = round(as.numeric(D $ dateTime [nrow(D )]) / 30 ) * 30
25+ newTime = seq(t0 , t1 , by = 30 )
26+ newD = as.data.frame(resample(raw = as.matrix(D $ heart_rate ),
27+ rawTime = as.numeric(D $ dateTime ),
28+ time = newTime ,
29+ stop = nrow(D )))
30+ colnames(newD )[1 ] = " heart_rate"
31+ if (length(newTime ) > nrow(newD )) newTime = newTime [1 : nrow(newD )]
32+ newD $ dateTime = as.POSIXct(newTime , tz = desiredtz )
33+ rm(D )
34+ D = newD [, c(" dateTime" , " heart_rate" )]
35+ }
1136 # double names is possible when recording is split across json files
1237 # in that case there may be multiple calories, steps and sleep files
1338 doubleNames = colnames(D )[colnames(D ) %in% colnames(data )]
@@ -43,8 +68,7 @@ mergeFitbitData = function(filenames = NULL, desiredtz = "", configtz = NULL) {
4368 cnt = cnt + 1
4469 }
4570 data = data [order(data $ dateTime ),]
46-
47- # fill gaps
71+ # fill gaps with NA values
4872 timeRange = range(data $ dateTime )
4973 epochSize = min(diff(as.numeric(data $ dateTime [1 : pmin(10 , nrow(data ))])))
5074 timeFrame = data.frame (dateTime = seq( timeRange [1 ], timeRange [2 ], by = epochSize ))
0 commit comments