1. Create RHRV-readable ASCII files from fit.

fit_to_csv.qmd

Author

Kizen Sasaki

First version

2023 November 30

Modified

2023 December 29

1. Install packages
1.1 FITfileR package
  • Install the devtools package then you can install the FITfileR package from github.
  • https://www.karada-good.net/analyticsr/r-747/
Code
# Check if 'FITfileR' package is installed, if not, install it using 'remotes'
if (!requireNamespace("FITfileR", quietly = TRUE)) {
  if (!requireNamespace("remotes", quietly = TRUE)) {
    install.packages("remotes")
  }
  remotes::install_github("grimbough/FITfileR")
}
library(FITfileR)
2. Read fit file
2.1 Using the readFitFile function.
  • Continuous data loading for improved reproducibility.
Code
library(lubridate)
#| message: true
setwd("~/Documents/brevet")
fit_file_name <- "fit_data/1040/2023-12-29-01-42-14.fit"
ReadFit <- readFitFile(fit_file_name)
ReadFit
Fit File
├╴File created: 2023-12-28 16:42:14
├╴Device: garmin NA
└╴Number of data messages: 23492
2.1.1 Verigy message_type
Code
listMessageTypes(ReadFit)
 [1] "file_id"         "device_settings" "user_profile"    "zones_target"   
 [5] "sport"           "session"         "lap"             "record"         
 [9] "event"           "device_info"     "activity"        "file_creator"   
2.1.2 Retrieve record data
Code
RecordData <- getMessagesByType(ReadFit,
                                message_type = "record")
names(RecordData)
[1] "record_1" "record_2" "record_3"
Code
head(RecordData$record_1,2)
# A tibble: 2 × 13
  timestamp           distance enhanced_altitude heart_rate temperature  rrhr
  <dttm>                 <dbl>             <dbl>      <int>       <int> <dbl>
1 2023-12-28 16:42:20        0               -60         65          21  65.1
2 2023-12-28 16:42:21        0               -60         65          21  65.6
# ℹ 7 more variables: rawHR <dbl>, RRint <dbl>, hrv <dbl>, loc <dbl>,
#   rmssd <dbl>, sdnn <dbl>, trndG_hrv <dbl>
2.1.3 Extract timestamp and heart rate data from
2.1.3.1 data storage argument
Code
MasterRecord <- NULL
  • Loop processing for RecordData
Code
for(i in seq(RecordData)){
  Record <- bind_cols("id" = i, RecordData[[i]])
  MasterRecord <- bind_rows(MasterRecord, Record)
}
2.1.3.2 Sort MasterRecord by time.
Code
MasterRecord <- MasterRecord %>%
  arrange(timestamp)
  • Create time_hr.csv to replace example.beta in RHVR.
  • Extract timestamp and heart_rate from MasterRecord to time_hr.
  • possible to add other data in c(“timestamp”, “heart_rate”, “cadence”, “speed”, “distance”, “altitude”, “power”, “temperature”, “etc”, “etc”)
Code
time_hr_01 <- MasterRecord[, c("timestamp", "heart_rate")] %>% 
                        na.omit() # delete NA
2.1.4 Convert the date to Japan Standard Time(JST).
Code
MasterRecord <-
  MasterRecord %>%
  mutate_if(is.POSIXt, ~with_tz(., tz = "Asia/Tokyo"))
2.1.4.1 Sort MasterRecord by time.
Code
MasterRecord <- MasterRecord %>%
  arrange(timestamp)
  • Create time_hr.csv to replace example.beta in RHVR.
  • Extract timestamp and heart_rate from MasterRecord to time_hr.
Code
time_hr <- MasterRecord[, c("timestamp", "heart_rate")] %>% 
                        na.omit() # delete NA
2.2 Write csv file and save to csv folder
Code
# Reproducibility needs improvement
file_name <- "20231229_night.csv" # input file name
write.csv(time_hr, file = file_name, row.names = FALSE)
2.3 Read csv file as data for next step.
Code
# Reproducibility needs improvement
file_name <- "20231229_night.csv"
folderPath <- "csv"
2.2.2 Write csv file to csv_xls folder
Code
# Reproducibility needs improvement
setwd("~/Documents/brevet")
write.table(time_hr, file.path(folderPath, file_name),
            sep = ",", row.names = FALSE)
3. Read csv file as data for next step.
Code
# Reproducibility needs improvement
setwd("~/Documents/brevet")
data <- read.table(file.path(folderPath, file_name),
                   header = TRUE, sep = ",", 
                   colClasses = c("character", "numeric"))