# Reading csv files with raw data in GGIR

NOTE: If you are viewing this page via CRAN note that the main GGIR documentation has been migrated to the GGIR GitHub pages.

# 1 Introduction

GGIR can automatically read data from the most-frequently used accelerometer brands in the field:

- GENEActiv .bin
- Axivity AX3 and AX6 .wav, .csv and .cwa
- ActiGraph .csv and .gt3x (.gt3x only the newer format generated with firmware versions above 2.5.0). Note for Actigraph users: If you want to work with .csv exports via the ActiLife then note that you have the option to export data with timestamps. Please do not do this as this causes memory issues for GGIR. To cope with the absence of timestamps GGIR will re-caculate timestamps from the sample frequency and the start time and date as presented in the file header
- Movisens with data stored in folders
- Genea (an accelerometer that is not commercially available anymore, but which was used for some studies between 2007 and 2012) .bin and .csv

However, the accelerometer manufacturers are proliferating with an increasing number of brands in the market. For such reason, GGIR includes the `read.myacc.csv` function, which is able to read accelerometer raw triaxial data stored in csv files, independently of the brand. This vignette provides a general introduction on how to use GGIR to read accelerometer raw data stored in csv files.

How it works:

Internally GGIR loads csv files with accelerometer data and standardises the output format to make the data compatible with other GGIR functions. Data format standardisation includes unit of measurement, timestamp, file header format, and column locations.

# 2 The read.myacc.csv function

As for the rest of GGIR functions, `read.myacc.csv` is intended to be used within function `GGIR`. All the arguments of the `read.myacc.csv` can be easily recognized as they all start by “rmc”. GGIR checks whether argument `rmc.firstrow.acc` is provided by the user; in such case, GGIR will attempt to read the data with function `read.myacc.csv`. In other words you always need to specify `rmc.firstrow.acc` to use `read.myacc.csv`. Further, we recommend that you always first test the function argument settings by first trying to use function `read.myacc.csv` on its own. When that works copy the arguments to you GGIR call.

## 2.1 Input arguments

As the `read.myacc.csv` function tries to read csv files with a wide variety of formats, the key arguments to specify depend on the characteristics of the csv file to process. Overall, if an argument is not relevant, it should be left in default setting (e.g., if the csv file does not contain temperature data, the arguments related to temperature settings should be left in default values).

Below we present a summary of the available input arguments. Please see the parameters vignette for a more elaborate description of these input arguments. Further, the arguments are also covered by the function documentation for the `read.myacc.csv` function.

### 2.1.1 General arguments

- `rmc.file` - Filename of file to be read if it is in the working directory, or full path to the file otherwise.
- `rmc.nrow` - Number of rows to read, same as nrow argument in and nrows in . The whole file is read by default (i.e., rmc.nrow = Inf).
- `rmc.skip` - Number of rows to skip, same as skip argument in and in .
- `rmc.dec` - Decimal separator used for numbers, same as dec argument in and in data.table::. If not “.” (default) then usually “,”.
- `rmc.firstrow.acc` - First row (number) of the acceleration data.
- `rmc.unit.acc` - Character with unit of acceleration values: “g”, “mg”, or “bit”.
- `desiredtz` - Timezone in which device was worn.
- `confgitz` - Timezone in which device was configured.
- `rmc.sf` - Sample rate in Hertz, if this is stored in the file header then that will be used instead.

### 2.1.2 Arguments for files containing a header

- `rmc.firstrow.header` - First row (number) of the file header. Leave blank (default) if the file does not have a file header. Not to be confused with a one row column header, a file header typically takes up several rows and has one or two columns. If the header has two columns, the first column is assumed to be the header item names and the second column is assumed to have the header item values. If the header has one column then it is assumed that each value contains both the name and the value of the item.
- `rmc.header.length` - If file has header, specify header length (numeric).
- `rmc.headername.sf` - If file has a header, row name (character) under which the sample frequency can be found, e.g. “sample_rate”.
- `rmc.headername.sn` - If file has a header, row name (character) under which the serial number can be found, e.g. “serial_number”.
- `rmc.headername.recordingid` - If file has a header, row name (character) under which the recording ID can be found, e.g. “ID”.
- `rmc.header.structure` - Character used to split the header name from the header value, e.g. “:” if a header value would look like “ID: 123” or ” ” if the ehader value would be like “ID 123”.

### 2.1.3 Arguments for files including timestamps

- `rmc.col.time` - Scalar with column (number) in which the timestamps are stored. Leave in default setting if timestamps are not stored.
- `rmc.unit.time` - Character with unit of timestamps: “POSIX”, “UNIXsec” (seconds since origin, see argument rmc.origin), “UNIXmsec” (milliseconds since origin, see argument rmc.origin), “character”, or “ActivPAL” (exotic timestamp format only used in the ActivPAL activity monitor).
- `rmc.format.time` - Character string giving a date-time format as used by . Only used for rmc.unit.time: character and POSIX.
- `rmc.origin` - Origin of time when unit of time is UNIXsec, e.g. 1970-1-1.

### 2.1.4 Arguments for files with acceleration stored in bits

- `rmc.bitrate` - Numeric: If unit of acceleration is a bit then provide bit rate, e.g. 12 bit.
- `rmc.dynamic_range` - Numeric, if unit of acceleration is a bit then provide dynamic range deviation in g from zero, e.g. +/-6g would mean this argument needs to be 6. If you give this argument a character value the code will search the file header for elements with a name equal to the character value and use the corresponding numeric value next to it as dynamic range.
- `rmc.unsignedbit` - Boolean, if unsignedbit = TRUE means that bits are only positive numbers. If unsignedbit = FALSE then bits are both positive and negative.

### 2.1.5 Arguments for files including temperature

- `rmc.col.temp` - Scalar with column (number) in which the temperature is stored. Leave in default setting if no temperature is avaible. The temperature will be used by .
- `rmc.unit.temp` - Character with unit of temperature values: (K)elvin, (C)elsius, or (F)ahrenheit.

### 2.1.6 Arguments for files including wear time information

- `rmc.col.wear` - If external wear detection outcome is stored as part of the data then this can be used by GGIR. This argument specifies the column in which the wear detection (Boolean) is stored.

### 2.1.7 Arguments to find time gaps and resampling

- `rmc.check4timegaps` - Boolean to indicate whether gaps in time should be imputed with most recent value normalised to 1 g.
- `rmc.doresample` - Boolean to indicate whether to resample the data based on the available timestamps and extracted sample rate from the file header
- `interpolationType` - Integer to indicate type of interpolation to be used when resampling time series (mainly relevant for Axivity sensors), 1=linear, 2=nearest neighbour.

# 3 Usage of the read.myacc.csv function

This section shows an example real case in which the read.myacc.csv function can be used. The csv file to be read has the following structure:

dateTime | acc_x | acc_y | acc_z | ambient_temp
--- | --- | --- | --- | ---
1/1/2022 16:48:26.000 | -0.42041016 | 0.41114536 | -0.76733398 | 24
1/1/2022 16:48:26.009 | -0.41674805 | 0.40919218 | -0.76611328 | 24
1/1/2022 16:48:26.019 | -0.42407227 | 0.40845973 | -0.77539062 | 24
1/1/2022 16:48:26.029 | -0.41894531 | 0.41163366 | -0.77246094 | 24
1/1/2022 16:48:26.039 | -0.4206543 | 0.41749321 | -0.76806641 | 24
1/1/2022 16:48:26.049 | -0.42163086 | 0.42091128 | -0.76757812 | 24
1/1/2022 16:48:26.059 | -0.42236328 | 0.41627247 | -0.76391602 | 24
1/1/2022 16:48:26.069 | -0.42431641 | 0.4189581 | -0.76171875 | 24
1/1/2022 16:48:26.079 | -0.42138672 | 0.41993469 | -0.76513672 | 24

This file contains timestamps in the column 1 (formatted as “%d/%m/%Y %H:%M:%OS”), the acceleration signals (in g’s) for the x, y, and z axis in the columns 2, 3, and 4, respectively, and temperature information in Celsius in the column 5. Also, this file has no file header.

Before we can use this with GGIR, we first test read this file using the `read.myacc.csv` function directly.

    library(GGIR)
    data = read.myacc.csv(rmc.file = "C:/mystudy/mydata/datafile.csv",
                   rmc.nrow = Inf,
                   rmc.skip = 0,
                   rmc.dec = ".",
                   rmc.firstrow.acc = 2,
                   rmc.col.acc = 2:4,
                   rmc.col.temp = 5,
                   rmc.col.time=1,
                   rmc.unit.acc = "g",
                   rmc.unit.temp = "C",
                   rmc.unit.time = "POSIX",
                   rmc.format.time = "%d/%m/%Y %H:%M:%OS",
                   desiredtz = "Europe/London",
                   rmc.sf = 100)

The object data is a list with a data.frame name data and a header. The time column in the data.frame represents timestamps expressed in seconds since 1-1-1970.

## 3.1 Example using the shell function

If the `rmc.firstrow.acc` argument is defined within the `GGIR` function, then the data will be read through `read.myacc.csv`. GGIR needs the user to specify in which row starts the accelerometer data within the csv, so this argument must be always explicitly specified by the user. Thus, a call to the `GGIR` including the rmc arguments would look as follows (note that the `rmc.file`, `rmc.nrow`, and `rmc.skip` arguments will not be used by `GGIR` as these arguments are already defined by `datadir`, `strategy`, and header arguments, respectively).

    library(GGIR)
    GGIR(
                 mode=c(1,2,3,4,5),
                 datadir="C:/mystudy/mydata/datafile.csv",
                 outputdir="D:/myresults",
                 do.report=c(2,4,5),
                 #=====================
                 # read.myacc.csv arguments
                 #=====================
                 rmc.nrow = Inf,
                 rmc.dec = ".",
                 rmc.firstrow.acc = 2,
                 rmc.col.acc = 2:4,
                 rmc.col.temp = 5,
                 rmc.col.time=1,
                 rmc.unit.acc = "g",
                 rmc.unit.temp = "C",
                 rmc.unit.time = "POSIX",
                 rmc.format.time = "%d/%m/%Y %H:%M:%OS",
                 desiredtz = "Europe/London",
                 rmc.sf = 100,
                 rmc.noise = 0.013
    )