I have a MATLAB struct, containing a number of fields which together describe, say, 100 observations of a number of variables, as follows (MATLAB output):
mystruct =
fieldA: [100x1 double]
fieldB: [100x1 double]
fieldC: [100x1 double]
fieldD: [100x1 char]
fieldE: {100x1 cell}
I want to use R with this data, so I save the struct as a .mat file. and import it using the R.matlab package. Because I'm new to R, the following is likely clumsy, but I can access individual fields just fine (R code):
> f = readMat('myfile.mat')
> data = f$mystruct
> data
, , 1
[,1]
fieldA Numeric,100
fieldB Numeric,100
fieldC Numeric,100
fieldD Character,100
fieldE List,100
> data = data[, , 1]
> df <- data.frame(fieldA = data$fieldA, fieldB = data$fieldB)
OK, so here is the question: how can I generalize the above so that a data frame is generated for an arbitrary number of fields in the original struct? For my 5-field example I can manually do it, but the next data set I have has many fields, and I don't want to enter them all.
As per this question, I tried rbind()
and ldply()
, which construct outrageously dimensioned data frames (401 obs of 1 variable and 401 obs of 105 variables respectively).
Importing MATLAB Files into R You can use the R. matlab package with its readMat() function to import MATLAB files into R. The readMat() function will return a named list structure that contains all variables from the MAT file that you imported.
A . m file will contain Matlab code which will probably be of no value to you because you can't run it in R.
load( filename ) loads data from filename . If filename is a MAT-file, then load(filename) loads variables in the MAT-file into the MATLAB® workspace. If filename is an ASCII file, then load(filename) creates a double-precision array containing data from the file.
As it turns out, the MATLAB cell array (fieldE
) was imported as a nested list. Using unlist
takes care of the problem:
data = lapply(data, unlist, use.names=FALSE)
df <- as.data.frame(data) # now has correct number of obs and vars
Thanks @koekenbakker for the critical pointer to this!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With