knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) # Set WD to Root
here::i_am("dev/hrv-old.Rmd")
library(testthat)
library(here)

OLD

Read HRV Report

read_HRV_report <- function(file,
                            ignore_missing_files = FALSE,
                            text_field = NULL,
                            docid_field = NULL,
                            docvarsfrom = c("metadata", "filenames", "filepaths"),
                            dvsep = "_",
                            docvarnames = NULL,
                            encoding = "UTF-16LE",
                            source = NULL,
                            cache = TRUE,
                            format_cols = TRUE,
                            ...
) {


  report_df  <- readtext::readtext(file = file,
                                   ignore_missing_files = ignore_missing_files,
                                   text_field = text_field,
                                   docid_field = docid_field,
                                   docvarsfrom = docvarsfrom,
                                   dvsep = dvsep,
                                   docvarnames = docvarnames,
                                   encoding = encoding,
                                   source = source,
                                   cache = cache,
                                   ...) %>%
    tibble::tibble() %>%
    dplyr::mutate(
      # Line 1
      File_LabChart = stringr::str_extract(text, .fields_regex[["File_LabChart"]]),
      Channel = stringr::str_extract(text, .fields_regex[["Channel"]]),
      Date = stringr::str_extract(text, .fields_regex[["Date"]]),
      # Line 2
      Start_time = stringr::str_extract(text, .fields_regex[["Start_time"]]),
      End_time = stringr::str_extract(text, .fields_regex[["End_time"]]),
      # Line 3
      Name = stringr::str_extract(text, .fields_regex[["Name"]]),
      Gender = stringr::str_extract(text, .fields_regex[["Gender"]]),
      Age = stringr::str_extract(text, .fields_regex[["Age"]]),
      # Line 4
      Beats_tot = stringr::str_extract(text, .fields_regex[["Beats_tot"]]),
      Rec_length = stringr::str_extract(text, .fields_regex[["Rec_length"]]),
      # Line 5
      Class_bound = stringr::str_extract(text, .fields_regex[["Class_bound"]]),
      # Line 6
      Discontinuities = stringr::str_extract(text, .fields_regex[["Discontinuities"]]),
      Beats_inserted = stringr::str_extract(text, .fields_regex[["Beats_inserted"]]),
      Beats_deleted = stringr::str_extract(text, .fields_regex[["Beats_deleted"]]),
      # Line 7
      NN_max = stringr::str_extract(text, .fields_regex[["NN_max"]]),
      NN_min = stringr::str_extract(text, .fields_regex[["NN_min"]]),
      NN_range = stringr::str_extract(text, .fields_regex[["NN_range"]]),
      # Line 8
      NN_mean = stringr::str_extract(text, .fields_regex[["NN_mean"]]),
      NN_median = stringr::str_extract(text, .fields_regex[["NN_median"]]),
      HR_avg = stringr::str_extract(text, .fields_regex[["HR_avg"]]),
      # Line 9
      SDNN = stringr::str_extract(text, .fields_regex[["SDNN"]]),
      SD_del_NN = stringr::str_extract(text, .fields_regex[["SD_del_NN"]]),
      RMSSD = stringr::str_extract(text, .fields_regex[["RMSSD"]]),
      # Line 10
      Normals_count = stringr::str_extract(text, .fields_regex[["Normals_count"]]),
      Ectopics_count = stringr::str_extract(text, .fields_regex[["Ectopics_count"]]),
      Artifacts_count = stringr::str_extract(text, .fields_regex[["Artifacts_count"]]),
      NN50_count = stringr::str_extract(text, .fields_regex[["NN50_count"]]),
      # Line 11
      Spec_intv = stringr::str_extract(text, .fields_regex[["Spec_intv"]]),
      Spec_mean_NN = stringr::str_extract(text, .fields_regex[["Spec_mean_NN"]]),
      # Line 12
      Power_tot = stringr::str_extract(text, .fields_regex[["Power_tot"]]),
      VLF_freq = stringr::str_extract(text, .fields_regex[["VLF_freq"]]),
      VLF = stringr::str_extract(text, .fields_regex[["VLF"]]) %>%
        stringr::str_extract(.fields_regex[["after_equal"]]),
      # Last line
      LF_freq = stringr::str_extract(text, .fields_regex[["LF_freq"]]),
      LF = stringr::str_extract(text, .fields_regex[["LF"]]) %>%
        stringr::str_extract(.fields_regex[["after_equal"]]),
      LF_nu = stringr::str_extract(text, .fields_regex[["LF_nu"]]),

      HF_freq = stringr::str_extract(text, .fields_regex[["HF_freq"]]),
      HF = stringr::str_extract(text, .fields_regex[["HF"]]) %>%
        stringr::str_extract(.fields_regex[["after_equal"]]),
      HF_nu = stringr::str_extract(text, .fields_regex[["HF_nu"]]),

      LF_HF = stringr::str_extract(text, .fields_regex[["LF_HF"]]) %>%
        stringr::str_extract(.fields_regex[["after_equal"]])
    ) %>%

    purrr::map_df(~stringr::str_trim(.x, side = "both"))

  if( !format_cols){ return(report_df) }

  ## Format column
  report_df %>%
    dplyr::mutate(dplyr::across(c(Channel, Gender), factor),
                  dplyr::across(Age, as.integer),
                  dplyr::across(c(Beats_tot,Rec_length, Discontinuities:Power_tot,
                                  VLF,LF, LF_nu, HF, HF_nu, LF_HF), as.numeric)
    ) %>%
    # Add pNN50
    dplyr::mutate(NN50_percent = 100 * (NN50_count/Normals_count), .after = NN50_count)

}

Lookup Regex

.fields_regex <- c(
  # Line 1
  File_LabChart = c("(?<=File: \").+(?=\")"),
  Channel = c("(?<=Channel: ).+(?=Date)"),
  Date = c("(?<=Date: ).+"),
  # Line 2
  Start_time = c("(?<=Start time: ).+(?=End time)"),
  End_time = c("(?<=End time: ).+"),
  # Line 3
  Name = c("(?<=Name: )[:graph:]+"),
  Gender = c("(?<=Gender: )[:alpha:]+"),
  Age = c("(?<=Age: )([:digit:]|[:punct:])+"),
  # Line 4
  Beats_tot = c("(?<=Total number of beats = )([:digit:]|[:punct:])+"),
  Rec_length = c("(?<=Length of recording = )([:digit:]|[:punct:])+"),
  # Line 5
  Class_bound = c("(?<=Classification boundaries: ).+"),
  # Line 6
  Discontinuities = c("(?<=Discontinuities = )([:digit:]|[:punct:])+"),
  Beats_inserted = c("(?<=Manually inserted beats = )([:digit:]|[:punct:])+"),
  Beats_deleted = c("(?<=Manually deleted beats = )([:digit:]|[:punct:])+"),
  # Line 7
  NN_max = c("(?<=Maximum NN = )([:digit:]|[:punct:])+"),
  NN_min = c("(?<=Minimum NN = )([:digit:]|[:punct:])+"),
  NN_range = c("(?<=Range = )([:digit:]|[:punct:])+"),
  # Line 8
  NN_mean = c("(?<=Mean NN = )([:digit:]|[:punct:])+"),
  NN_median = c("(?<=Median NN = )([:digit:]|[:punct:])+"),
  HR_avg = c("(?<=Average heart rate = )([:digit:]|[:punct:])+"),
  # Line 9
  SDNN = c("(?<=SDNN = )([:digit:]|[:punct:])+"),
  SD_del_NN = c("(?<=SD of delta NN = )([:digit:]|[:punct:])+"),
  RMSSD = c("(?<=RMSSD = )([:digit:]|[:punct:])+"),
  # Line 10
  Normals_count = c("(?<=Normals = )([:digit:]|[:punct:])+"),
  Ectopics_count = c("(?<=Ectopics = )([:digit:]|[:punct:])+"),
  Artifacts_count = c("(?<=Artifacts = )([:digit:]|[:punct:])+"),
  NN50_count = c("(?<=NN50 = )([:digit:]|[:punct:])+"),
  # Line 11
  Spec_intv = c("(?<=Spectrum intervals = )([:digit:]|[:punct:])+"),
  Spec_mean_NN = c("(?<=Mean spectrum NN = )([:digit:]|[:punct:])+"),

  ## Extract after equal sign
  after_equal = c("(?<== )([:digit:]|[:punct:])+"),

  # Line 12
  Power_tot = c("(?<=Total power = )([:digit:]|[:punct:])+"),
  VLF_freq = c("(?<=VLF \\().+(?=\\))"),
  VLF = c("VLF \\(.+\\) = ([:digit:]|[:punct:])+"),
  # Last Line
  LF_freq = c("(?<=((?<!V)(LF) \\())[^\\)]+"),
  LF = c("(?<!V)(LF) \\(.+\\) = ([:digit:]|[:punct:])+"),
  LF_nu = c("(\\.|[:digit:])+(?=( nu\\)[:blank:]+HF))"),

  HF_freq = c("(?<=((HF) \\())[^\\)]+"),
  HF = c("(HF) \\(.+\\) = ([:digit:]|[:punct:])+"),
  HF_nu = c("(\\.|[:digit:])+(?=( nu\\)[:blank:]+LF/HF))"),

  LF_HF = c("(LF/HF) = ([:digit:]|[:punct:])+")

)


Lightbridge-KS/labChartHRV documentation built on June 12, 2022, 3:21 p.m.