diff --git a/NEWS.md b/NEWS.md index e964452..dcb490d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# Changes in version 1.0.5 (release date:??-??-2025) + +- Fitbit: Now also loads heart rate data #78 + +- ActiWatch: Enable recognition of file extension when filename has more than one dot. + # Changes in version 1.0.4 (release date:31-03-2025) - Fitbit: Fix bug preventing the loading of a sequence of json files. #76 diff --git a/R/getExtension.R b/R/getExtension.R index 6e9e6bc..bc7fa61 100644 --- a/R/getExtension.R +++ b/R/getExtension.R @@ -2,7 +2,7 @@ getExtension <- function(filename){ # Extract file extension ex <- unlist(strsplit(basename(filename), split = "[.]")) if (length(ex) < 2) stop(paste0("Cannot recognise extension from '", filename, "' as filename, please check"), call. = FALSE) - return(ex[-1]) + return(ex[length(ex)]) } diff --git a/R/mergeFitbitData.R b/R/mergeFitbitData.R index 4fa4dbe..0b0d772 100644 --- a/R/mergeFitbitData.R +++ b/R/mergeFitbitData.R @@ -3,11 +3,36 @@ mergeFitbitData = function(filenames = NULL, desiredtz = "", configtz = NULL) { stop("Provide at least two filenames") } cnt = 1 + + # change order filenames such that + # heart rate if present is at the end, because heart rate + # has irregular epoch length and needs to be interpolated + filenames = filenames[c(grep(pattern = "sleep", x = basename(filenames), invert = FALSE), + grep(pattern = "calories", x = basename(filenames), invert = FALSE), + grep(pattern = "step", x = basename(filenames), invert = FALSE), + grep(pattern = "heart", x = basename(filenames), invert = FALSE))] + while (cnt <= length(filenames)) { D = readFitbit(filename = filenames[cnt], desiredtz = desiredtz, configtz = configtz) if (cnt == 1) { data = D } else { + if (length(grep("heart", x = colnames(D))) > 0) { + # interpolate heart rate to 30 seconds to ease merging with + # other data types + t0 = round(as.numeric(D$dateTime[1]) / 30) * 30 + t1 = round(as.numeric(D$dateTime[nrow(D)]) / 30) * 30 + newTime = seq(t0, t1, by = 30) + newD = as.data.frame(resample(raw = as.matrix(D$heart_rate), + rawTime = as.numeric(D$dateTime), + time = newTime, + stop = nrow(D))) + colnames(newD)[1] = "heart_rate" + if (length(newTime) > nrow(newD)) newTime = newTime[1:nrow(newD)] + newD$dateTime = as.POSIXct(newTime, tz = desiredtz) + rm(D) + D = newD[, c("dateTime", "heart_rate")] + } # double names is possible when recording is split across json files # in that case there may be multiple calories, steps and sleep files doubleNames = colnames(D)[colnames(D) %in% colnames(data)] @@ -43,8 +68,7 @@ mergeFitbitData = function(filenames = NULL, desiredtz = "", configtz = NULL) { cnt = cnt + 1 } data = data[order(data$dateTime),] - - # fill gaps + # fill gaps with NA values timeRange = range(data$dateTime) epochSize = min(diff(as.numeric(data$dateTime[1:pmin(10, nrow(data))]))) timeFrame = data.frame(dateTime = seq( timeRange[1], timeRange[2], by = epochSize)) diff --git a/R/readFitbit.R b/R/readFitbit.R index 6a48398..c0d9c0b 100644 --- a/R/readFitbit.R +++ b/R/readFitbit.R @@ -77,6 +77,15 @@ readFitbit = function(filename = NULL, desiredtz = "", D = handleTimeGaps(data, epochSize = 30) D$value = as.numeric(D$value) / 2 colnames(D)[2] = dataType + } else if (dataType == "heart_rate") { + collapseHR = function(x) { + y = data.frame(dateTime = x$dateTime, bpm = x$value$bpm, confidence = x$value$confidence) + return(y) + } + D = as.data.frame(data.table::rbindlist(lapply(D, collapseHR), fill = TRUE)) + D = D[!duplicated(D),] + D$dateTime = as.POSIXct(D$dateTime, format = "%m/%d/%y %H:%M:%S", tz = configtz) + colnames(D)[2] = dataType } else { stop("File type not recognised") } diff --git a/inst/testfiles/heart_rate-1995-06-24.json b/inst/testfiles/heart_rate-1995-06-24.json new file mode 100644 index 0000000..ce888ba --- /dev/null +++ b/inst/testfiles/heart_rate-1995-06-24.json @@ -0,0 +1,1207 @@ +[{ + "dateTime" : "06/24/95 16:00:10", + "value" : { + "bpm" : 70, + "confidence" : 0 + } +},{ + "dateTime" : "06/24/95 16:00:20", + "value" : { + "bpm" : 68, + "confidence" : 0 + } +},{ + "dateTime" : "06/24/95 16:00:30", + "value" : { + "bpm" : 69, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:00:45", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:00:50", + "value" : { + "bpm" : 77, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:00:55", + "value" : { + "bpm" : 77, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:01:10", + "value" : { + "bpm" : 77, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:01:20", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:01:25", + "value" : { + "bpm" : 73, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:01:30", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:01:35", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:01:45", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:01:50", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:02:05", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:02:10", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:02:15", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:02:30", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:02:45", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:00", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:10", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:15", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:25", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:35", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:40", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:45", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:03:55", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:04:00", + "value" : { + "bpm" : 68, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:04:04", + "value" : { + "bpm" : 68, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:04:09", + "value" : { + "bpm" : 69, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:04:14", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:04:24", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:04:29", + "value" : { + "bpm" : 73, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:04:34", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:04:49", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:04", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:09", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:14", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:19", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:24", + "value" : { + "bpm" : 77, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:05:29", + "value" : { + "bpm" : 76, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:06:31", + "value" : { + "bpm" : 70, + "confidence" : 0 + } +},{ + "dateTime" : "06/24/95 16:06:46", + "value" : { + "bpm" : 71, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:06:57", + "value" : { + "bpm" : 71, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:07", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:17", + "value" : { + "bpm" : 65, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:22", + "value" : { + "bpm" : 67, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:27", + "value" : { + "bpm" : 65, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:32", + "value" : { + "bpm" : 64, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:47", + "value" : { + "bpm" : 64, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:07:52", + "value" : { + "bpm" : 67, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:02", + "value" : { + "bpm" : 68, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:07", + "value" : { + "bpm" : 70, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:12", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:27", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:42", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:08:47", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:08:52", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:09:02", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:09:07", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:09:22", + "value" : { + "bpm" : 73, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:09:27", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:09:42", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:09:57", + "value" : { + "bpm" : 74, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:10:07", + "value" : { + "bpm" : 73, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:10:22", + "value" : { + "bpm" : 73, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:10:27", + "value" : { + "bpm" : 73, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:10:42", + "value" : { + "bpm" : 73, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:10:57", + "value" : { + "bpm" : 73, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:11:02", + "value" : { + "bpm" : 73, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:11:07", + "value" : { + "bpm" : 72, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:11:12", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:11:27", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:11:42", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:11:57", + "value" : { + "bpm" : 71, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:12:07", + "value" : { + "bpm" : 70, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:12:22", + "value" : { + "bpm" : 70, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:12:27", + "value" : { + "bpm" : 69, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:12:42", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:12:47", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:12:52", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:13:07", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:13:22", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:13:37", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:13:52", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:14:07", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:14:22", + "value" : { + "bpm" : 68, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:14:37", + "value" : { + "bpm" : 68, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:14:47", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:14:57", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:15:12", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:15:17", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:15:27", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:15:42", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:15:57", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:12", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:27", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:32", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:47", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:52", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:16:57", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:17:12", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:17:27", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:17:42", + "value" : { + "bpm" : 69, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:17:52", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:07", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:22", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:37", + "value" : { + "bpm" : 70, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:42", + "value" : { + "bpm" : 71, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:47", + "value" : { + "bpm" : 72, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:52", + "value" : { + "bpm" : 73, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:18:57", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:02", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:17", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:32", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:47", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:52", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:19:57", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:12", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:17", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:32", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:47", + "value" : { + "bpm" : 81, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:52", + "value" : { + "bpm" : 82, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:20:57", + "value" : { + "bpm" : 83, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:02", + "value" : { + "bpm" : 86, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:07", + "value" : { + "bpm" : 88, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:12", + "value" : { + "bpm" : 89, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:27", + "value" : { + "bpm" : 90, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:32", + "value" : { + "bpm" : 93, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:37", + "value" : { + "bpm" : 94, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:42", + "value" : { + "bpm" : 93, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:21:57", + "value" : { + "bpm" : 92, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:02", + "value" : { + "bpm" : 93, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:07", + "value" : { + "bpm" : 92, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:12", + "value" : { + "bpm" : 90, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:17", + "value" : { + "bpm" : 92, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:22", + "value" : { + "bpm" : 93, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:32", + "value" : { + "bpm" : 94, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:37", + "value" : { + "bpm" : 98, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:42", + "value" : { + "bpm" : 103, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:22:47", + "value" : { + "bpm" : 107, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:22:52", + "value" : { + "bpm" : 103, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:22:57", + "value" : { + "bpm" : 102, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:23:12", + "value" : { + "bpm" : 102, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:23:22", + "value" : { + "bpm" : 102, + "confidence" : 0 + } +},{ + "dateTime" : "06/24/95 16:23:37", + "value" : { + "bpm" : 105, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:23:42", + "value" : { + "bpm" : 108, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:23:47", + "value" : { + "bpm" : 107, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:02", + "value" : { + "bpm" : 106, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:17", + "value" : { + "bpm" : 106, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:22", + "value" : { + "bpm" : 105, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:27", + "value" : { + "bpm" : 104, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:32", + "value" : { + "bpm" : 103, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:24:37", + "value" : { + "bpm" : 102, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:24:52", + "value" : { + "bpm" : 101, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:07", + "value" : { + "bpm" : 101, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:12", + "value" : { + "bpm" : 100, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:17", + "value" : { + "bpm" : 99, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:22", + "value" : { + "bpm" : 100, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:27", + "value" : { + "bpm" : 101, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:42", + "value" : { + "bpm" : 101, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:25:47", + "value" : { + "bpm" : 100, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:25:52", + "value" : { + "bpm" : 98, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:25:57", + "value" : { + "bpm" : 99, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:26:07", + "value" : { + "bpm" : 98, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:26:12", + "value" : { + "bpm" : 88, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:26:17", + "value" : { + "bpm" : 78, + "confidence" : 1 + } +},{ + "dateTime" : "06/24/95 16:26:22", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:26:32", + "value" : { + "bpm" : 81, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:26:37", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:26:47", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:02", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:07", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:17", + "value" : { + "bpm" : 76, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:22", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:37", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:42", + "value" : { + "bpm" : 81, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:27:57", + "value" : { + "bpm" : 81, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:07", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:12", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:27", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:32", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:42", + "value" : { + "bpm" : 76, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:47", + "value" : { + "bpm" : 74, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:52", + "value" : { + "bpm" : 75, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:28:57", + "value" : { + "bpm" : 76, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:02", + "value" : { + "bpm" : 77, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:12", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:22", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:27", + "value" : { + "bpm" : 76, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:32", + "value" : { + "bpm" : 77, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:47", + "value" : { + "bpm" : 77, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:29:52", + "value" : { + "bpm" : 78, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:30:07", + "value" : { + "bpm" : 79, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:30:12", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:30:17", + "value" : { + "bpm" : 83, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:30:22", + "value" : { + "bpm" : 80, + "confidence" : 2 + } +},{ + "dateTime" : "06/24/95 16:30:27", + "value" : { + "bpm" : 76, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:30:42", + "value" : { + "bpm" : 78, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:30:47", + "value" : { + "bpm" : 80, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:31:02", + "value" : { + "bpm" : 82, + "confidence" : 3 + } +},{ + "dateTime" : "06/24/95 16:31:07", + "value" : { + "bpm" : 80, + "confidence" : 3 + } +}] \ No newline at end of file diff --git a/tests/testthat/test_mergeFitbitData.R b/tests/testthat/test_mergeFitbitData.R index 9ce06be..5352c45 100644 --- a/tests/testthat/test_mergeFitbitData.R +++ b/tests/testthat/test_mergeFitbitData.R @@ -1,9 +1,11 @@ library(GGIRread) context("merge PHB files") test_that("merging of PHB files goes correctly", { + file1 = system.file("testfiles/steps-1995-06-23_Fitbit.json", package = "GGIRread") file2 = system.file("testfiles/calories-1995-06-23_Fitbit.json", package = "GGIRread") file3 = system.file("testfiles/sleep-1995-06-23_Fitbit.json", package = "GGIRread") + file4 = system.file("testfiles/heart_rate-1995-06-24.json", package = "GGIRread") # apply function to merge the files D = mergeFitbitData(filenames = c(file1, file2), @@ -14,11 +16,20 @@ test_that("merging of PHB files goes correctly", { expect_equal(sum(D$calories, na.rm = TRUE), 68.82, tol = 0.01) expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") - # apply function to merge the files + # apply function to merge tree files D2 = mergeFitbitData(filenames = c(file1, file2, file3), desiredtz = "Europe/Amsterdam") expect_true(all(colnames(D2) %in% c("dateTime", "steps", "calories", "sleeplevel"))) expect_equal(nrow(D2), 47874) - rm(D2, D) + + + # apply function to merge all four files + D3 = mergeFitbitData(filenames = c(file1, file2, file3, file4), + desiredtz = "Europe/Amsterdam") + expect_true(all(colnames(D2) %in% c("dateTime", "steps", "calories", "sleeplevel", "heart_rate"))) + expect_equal(nrow(D2), 47874) + expect_equal(mean(D3$heart_rate, na.rm = TRUE), 77.18201, tolerance = 0.0001) + expect_equal(sum(D3$steps, na.rm = TRUE), 607) + rm(D3, D2, D) }) \ No newline at end of file