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)> labpcMaker 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')>> labpcdatalabpcdata 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
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: #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 >
Richard.Cotton at hsl.gov.uk
2008-Mar-27 09:21 UTC
[R] Moving data between R and Matlab back and forth?
> > > I realized that not everyone has Matlab and that basically theissue> > > is purely how to deal with the returned data in R, so I haverevised> > > my example code and made it easier to copy-paste and run:> > > #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?This works, but I don't know how well it will generalise to other imported matrices. as.data.frame(lapply(drop(labpcimport), unlist)) Regards, Richie. Mathematical Sciences Unit HSL ------------------------------------------------------------------------ ATTENTION: This message contains privileged and confidential inform...{{dropped:20}}