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':
#>
#> window
Thie 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.