library(EGM)
#> WFDB software detected and set as `options(wfdb_path = '/usr/local/bin')`
#> 
#> Attaching package: 'EGM'
#> The following object is masked from 'package:stats':
#> 
#>     windowThie software supports reading in certain types of raw cardiac
electric signal currently. This includes both intracardiac and
extracardiac data. Please see read_muse() and
read_bard() as examples. If additional formats are
requested, please file an issue and
provide a sample file (which primarily requires signal, in whatever
format, and meta-information about the individual channels).
Here is a simple example of taking a MUSE XML file and converting it to digital signal. This was tested against the 9th version of the MUSE XML format.
# Read in data
fp <- system.file('extdata', 'muse-sinus.xml', package = 'EGM')
xml <- readLines(fp)
head(xml)
#> [1] "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"
#> [2] "<!DOCTYPE RestingECG SYSTEM \"restecg.dtd\">"   
#> [3] "<RestingECG>"                                   
#> [4] "   <MuseInfo>"                                  
#> [5] "      <MuseVersion>9.0.10.18530</MuseVersion>"  
#> [6] "   </MuseInfo>"
# Instead, can read this in as a MUSE XML file
# Now as an `egm` class
ecg <- read_muse(fp)
ecg
#> <Electrogram>
#> -------------------
#> Recording Duration:  10 seconds
#> Recording frequency  500  hz
#> Number of channels:  12 
#> Channel Names:  I II III AVF AVL AVR V1 V2 V3 V4 V5 V6 
#> Annotation:   
#> Type: Standard 12-lead ECG
# Can now plot this easily
ggm(ecg) + 
  theme_egm_light()
#> Scale for colour is already present.
#> Adding another scale for colour, which will replace the existing scale.
#> Scale for colour is already present.
#> Adding another scale for colour, which will replace the existing scale.Similarly, intracardiac recordings obtained through bard can be read in as well. The function itself documents how this generally work.
# Read in data
fp <- system.file('extdata', 'bard-avnrt.txt', package = 'EGM')
bard <- readLines(fp)
head(bard, n = 20)
#>  [1] "[Header]"                  "File Type: 1"             
#>  [3] "Version: 2"                "Channels exported: 11"    
#>  [5] "Samples per channel: 3522" "Start time: 15:17:57"     
#>  [7] "End time: 15:18:01"        "Ch. Info. Pointer: 320"   
#>  [9] "Stamp Data: C"             "Mux format: 0"            
#> [11] "Mux Block Size: "          "Data Format 1"            
#> [13] "Sample Rate: 1000Hz"       "Channel #:   1"           
#> [15] "Label: I"                  "Range: 5mv "              
#> [17] "Low: .5Hz"                 "High: 100Hz"              
#> [19] "Sample rate: 1000Hz"       "Color: FFFFFF"
# Instead, read this as signal, breaking apart header and signal data
# Presented as an `egm` class object
egram <- read_bard(fp)
egram
#> <Electrogram>
#> -------------------
#> Recording Duration:  3.522 seconds
#> Recording frequency  1000  hz
#> Number of channels:  11 
#> Channel Names:  I III V1 CS 1-2 CS 3-4 CS 5-6 CS 7-8 CS 9-10 HIS D HIS M RV 1-2 
#> Annotation:
# Similarly, can be visualized with ease
ggm(egram, channels = c('HIS', 'CS', 'RV'), mode = NULL) +
    theme_egm_dark() 
#> Scale for colour is already present.
#> Adding another scale for colour, which will replace the existing scale.The {EGM} package introduces a specific data-oriented
class called egm (note the lower-case spelling
compared to the package name). This class is the primary data structure,
and allows for compatibility within multiple signal types, including
when reading in WFDB-formatted data. Once in this class, everything can
be written out as well - with the preferred option being for the stated
WFDB format.