[R] Moving data between R and Matlab back and forth?
Tribo Laboy
tribolaboy at gmail.com
Thu Mar 27 08:26:14 CET 2008
Hello,
Thanks for the input. I thought it wasn't much fun to talk to myself
on the public forums. ;-)
Trying the line you suggested generated and error:
as.data.frame(drop(labpcimport))
Error in data.frame(Maker = list("HP", "HP", "Sony", "DELL", "whitebox", :
arguments imply differing number of rows: 1, 6
However I think I found how to do it. Here is the snippets that works for me.
--------------------------------Code begin ---------------
labpc <- drop(labpcimport) # Drops all the unnecessary indexes with
length 1 and the list becomes much simpler
# If any of the contents of each cell is a list then "rbind" its
elements into a single vector and treat it as a factor
# These elements were represented as cell elements of a cell array in
the MATLAB structure.
for (k in 1:length(labpc)){
if (mode(labpc[[k]]) == "list") {
labpc[[k]]<- as.factor(do.call("rbind", labpc[[k]]))
}
}
labpcdata <- as.data.frame(labpc)
-----------------------------------Code end --------------------
Regards,
TL
On Thu, Mar 27, 2008 at 4:08 PM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
> On Thu, 27 Mar 2008, Tribo Laboy wrote:
>
> > I realized that not everyone has Matlab and that basically the issue
> > is purely how to deal with the returned data in R, so I have revised
> > my example code and made it easier to copy-paste and run:
>
> Only for those with matlab! The rest of us have little clue what the
> format of the output is -- it looks like a list array, which is not what
> the help page for readMat says it is.
>
> I would try
>
> as.data.frame(drop(labpcimport))
>
>
>
>
> > #Make a data frame in R
> >
> > Maker <- factor(c("HP", "HP", "Sony", "DELL", "whitebox", "whitebox"))
> > CPUspeed <- c(2,4,2.5,2.5,2,5)
> > HDD <- c(80, 250, 100, 100, 80, 300)
> > RAM <- c(2, 2, 1, 2, 2, 4)
> > labpc <- data.frame(Maker, CPUspeed, HDD, RAM)
> > labpc
> >
> > #Save in Matlab v6 format with 'writeMat'
> >
> > library(R.matlab)
> > writeMat("labpc.mat", labpcexport = labpc)
> >
> > #Load the file in R with 'readMat'
> >
> > labpcfile <- readMat("labpc.mat")
> > labpcimport <- labpcfile$labpcexport
> > labpcimport
> >
> > # This is the last line output
> > #, , 1
> > #
> > # [,1]
> > #Maker List,6
> > #CPUspeed Numeric,6
> > #HDD Numeric,6
> > #RAM Numeric,6
> >
> > Now, how do I convert the result held in labpcimport back to a data frame?
> >
> > Thanks in advance,
> >
> > TL
> >
> > On Thu, Mar 27, 2008 at 1:27 AM, Tribo Laboy <tribolaboy at gmail.com> wrote:
> >> Hi to the list,
> >>
> >> I am trying to find a way to painlessly move structured data back and
> >> forth between R and Matlab (also Octave). For this purpose I found the
> >> R.matlab package great help. I wish to use a Matlab -v6 MAT file as an
> >> intermediary format, because it is well read by both Matlab and
> >> Octave. It is also well read by 'readMat' function in R.matlab
> >> package, but that is where I run into problems because of poor
> >> knowledge of R.
> >>
> >> By structured data I mean data in data frames in R and the closest
> >> equivalent - structures in Matlab. Here is what I have done.
> >>
> >> -----------------------------------------------------
> >> Make a data frame in R and export it
> >> -----------------------------------------------------
> >>
> >> > Maker <- factor(c("HP", "HP", "Sony", "DELL", "whitebox", "whitebox"))
> >> > CPUspeed <- c(2,4,2.5,2.5,2,5)
> >> > HDD <- c(80, 250, 100, 100, 80, 300)
> >> > RAM <- c(2, 2, 1, 2, 2, 4)
> >> > labpc <- data.frame(Maker, CPUspeed, HDD, RAM)
> >>
> >> > labpc
> >> Maker CPUspeed HDD RAM
> >> 1 HP 2.0 80 2
> >> 2 HP 4.0 250 2
> >> 3 Sony 2.5 100 1
> >> 4 DELL 2.5 100 2
> >> 5 whitebox 2.0 80 2
> >> 6 whitebox 5.0 300 4
> >>
> >> > library(R.matlab)
> >> > writeMat("labpc.mat", labpcdata = labpc)
> >> --------------------------------------------------------------
> >>
> >> --------------------------------------------------------------
> >> In MATLAB - everything is as expected
> >> --------------------------------------------------------------
> >> load('labpc.mat')
> >>
> >> >> labpcdata
> >>
> >> labpcdata =
> >>
> >> Maker: {6x1 cell}
> >> CPUspeed: [6x1 double]
> >> HDD: [6x1 double]
> >> RAM: [6x1 double]
> >>
> >> >> class(labpcdata)
> >>
> >> ans =
> >>
> >> struct
> >>
> >> >> labpcstruct = labpcdata
> >> >> save('labpcstruct.mat', 'labpcstruct')
> >> ---------------------------------------------------------
> >>
> >>
> >> -------------------------------------------------------
> >> Back in R - how to rebuild the data frame from the list labpcstruct?
> >> -------------------------------------------------------
> >> > labpcfile <- readMat("labpcstruct.mat")
> >> > labpcfile
> >> $labpcstruct
> >> , , 1
> >>
> >> [,1]
> >> Maker List,6
> >> CPUspeed Numeric,6
> >> HDD Numeric,6
> >> RAM Numeric,6
> >>
> >>
> >> attr(,"header")
> >> attr(,"header")$description
> >> [1] "MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Mar 26
> >> 15:49:21 2008 "
> >>
> >> attr(,"header")$version
> >> [1] "5"
> >>
> >> attr(,"header")$endian
> >> [1] "little"
> >>
> >> > labpcstruct <- labpcfile$labpcstruct
> >> > labpcstruct
> >> , , 1
> >>
> >> [,1]
> >> Maker List,6
> >> CPUspeed Numeric,6
> >> HDD Numeric,6
> >> RAM Numeric,6
> >>
> >>
> >> > typeof(labpcstruct)
> >> [1] "list"
> >>
> >> --------------------------------------------
> >>
> >> So if there is any kind soul that will tell me how to get back the
> >> original data frame from the imported list 'labpcstruct', that would
> >> be great.
> >>
> >> Regards,
> >>
> >> TL
> >>
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
> --
> Brian D. Ripley, ripley at stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
More information about the R-help
mailing list