

I have working code to write a file out as fwf as shown below. I have one question to try and automate this I cannot get to work.
I am generating thousands of data files for a simulation to be run outside of R and each file varies in its dimensions. So I am trying to write code that can write the fwf based on the dimensions of each file generated as shown below. I have commented this code with an example to show where I am stuck.
### Create a sample data matrix
myMat < matrix(rnorm(9), 3,3)
### Create the vector of format strings to be equal to the length of the columns in myMat
aa < rep('%4f', ncol(myMat))
xx < paste(aa, sep='', collapse='')
### Now I could just do this below and it works
(out < sprintf(xx, myMat[, 1], myMat[, 2], myMat[, 3]) )
out < as.matrix(out) # convert to a character matrix
dimnames(out) < list(rep('', nrow(out)), '') # blank row and column names
noquote(out) ## sink this file to a directory
But, the fact that the dimensions of my matrix vary at each iteration means I need to automate this part in the sprint().
myMat[, 1], myMat[, 2], myMat[, 3])
I think that's needed because something like the following does not work
(out < sprintf(xx, myMat[, 1:3]) )
So, I thought about trying smoething like this
cols < paste(paste('myMat[, ', 1:ncol(myMat), sep=''), ']', sep='')
cols < paste(cols, collapse=', ')
But, this is a string with quotation marks, so I thought using cat() might work, but it does not
(out < sprintf(xx, cat(cols) ) )
Anyone have a suggestion for the right way to do this, this is getting messy.
Thank
Harold
[[alternative HTML version deleted]]
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/rhelpPLEASE do read the posting guide http://www.Rproject.org/postingguide.htmland provide commented, minimal, selfcontained, reproducible code.


Hi,
May be this helps:
xx < paste(aa, collapse=' ')
set.seed(14)
myMat < matrix(rnorm(9), 3,3)
sprintf(xx,myMat[,1],myMat[,2],myMat[,3])
# [1] "0.661850 1.497154 0.064881"
# "1.718954 0.036141 1.068994"
# [3] "2.121667 1.231945 0.376965"
do.call(sprintf,c(xx,split(myMat,col(myMat))))
#[1] "0.661850 1.497154 0.064881"
#"1.718954 0.036141 1.068994"
#[3] "2.121667 1.231945 0.376965"
A.K.
On Friday, April 11, 2014 3:56 PM, "Doran, Harold" < [hidden email]> wrote:
I have working code to write a file out as fwf as shown below. I have one question to try and automate this I cannot get to work.
I am generating thousands of data files for a simulation to be run outside of R and each file varies in its dimensions. So I am trying to write code that can write the fwf based on the dimensions of each file generated as shown below. I have commented this code with an example to show where I am stuck.
### Create a sample data matrix
myMat < matrix(rnorm(9), 3,3)
### Create the vector of format strings to be equal to the length of the columns in myMat
aa < rep('%4f', ncol(myMat))
xx < paste(aa, sep='', collapse='')
### Now I could just do this below and it works
(out < sprintf(xx, myMat[, 1], myMat[, 2], myMat[, 3]) )
out < as.matrix(out) # convert to a character matrix
dimnames(out) < list(rep('', nrow(out)), '') # blank row and column names
noquote(out) ## sink this file to a directory
But, the fact that the dimensions of my matrix vary at each iteration means I need to automate this part in the sprint().
myMat[, 1], myMat[, 2], myMat[, 3])
I think that's needed because something like the following does not work
(out < sprintf(xx, myMat[, 1:3]) )
So, I thought about trying smoething like this
cols < paste(paste('myMat[, ', 1:ncol(myMat), sep=''), ']', sep='')
cols < paste(cols, collapse=', ')
But, this is a string with quotation marks, so I thought using cat() might work, but it does not
(out < sprintf(xx, cat(cols) ) )
Anyone have a suggestion for the right way to do this, this is getting messy.
Thank
Harold
[[alternative HTML version deleted]]
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/rhelpPLEASE do read the posting guide http://www.Rproject.org/postingguide.htmland provide commented, minimal, selfcontained, reproducible code.
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/rhelpPLEASE do read the posting guide http://www.Rproject.org/postingguide.htmland provide commented, minimal, selfcontained, reproducible code.


Try this. It creates a 'list' that are the parameters for sprintf. It
writes out the file that I attach as the dump:
### Create a sample data matrix
myMat < matrix(rnorm(9), 3,3)
# create the format required  make sure it is wide enough
# for 'fixed' width
xx < paste(rep("%8.2f", ncol(myMat)), collapse = '')
# create a list for 'do.call(sprintf'
callList < vector('list', ncol(myMat) + 1)
callList[[1]] < xx # store in the format
# add the columns to the list
for (i in seq(ncol(myMat))) callList[[i + 1L]] < myMat[, i]
callList # print it out
result < do.call(sprintf, callList)
# write out the data to a file
writeLines(result, '/temp/file.txt')
Here is what is in the file:
0.39 0.45 0.44
0.82 0.68 0.43
2.05 0.85 0.61
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Fri, Apr 11, 2014 at 2:48 PM, Doran, Harold < [hidden email]> wrote:
> I have working code to write a file out as fwf as shown below. I have one
> question to try and automate this I cannot get to work.
>
> I am generating thousands of data files for a simulation to be run outside
> of R and each file varies in its dimensions. So I am trying to write code
> that can write the fwf based on the dimensions of each file generated as
> shown below. I have commented this code with an example to show where I am
> stuck.
>
> ### Create a sample data matrix
> myMat < matrix(rnorm(9), 3,3)
>
> ### Create the vector of format strings to be equal to the length of the
> columns in myMat
> aa < rep('%4f', ncol(myMat))
> xx < paste(aa, sep='', collapse='')
>
> ### Now I could just do this below and it works
> (out < sprintf(xx, myMat[, 1], myMat[, 2], myMat[, 3]) )
> out < as.matrix(out) # convert to a character matrix
> dimnames(out) < list(rep('', nrow(out)), '') # blank row and column names
> noquote(out) ## sink this file to a directory
>
> But, the fact that the dimensions of my matrix vary at each iteration
> means I need to automate this part in the sprint().
>
> myMat[, 1], myMat[, 2], myMat[, 3])
>
> I think that's needed because something like the following does not work
>
> (out < sprintf(xx, myMat[, 1:3]) )
>
>
> So, I thought about trying smoething like this
> cols < paste(paste('myMat[, ', 1:ncol(myMat), sep=''), ']', sep='')
> cols < paste(cols, collapse=', ')
>
> But, this is a string with quotation marks, so I thought using cat() might
> work, but it does not
>
> (out < sprintf(xx, cat(cols) ) )
>
> Anyone have a suggestion for the right way to do this, this is getting
> messy.
>
> Thank
> Harold
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/rhelp> PLEASE do read the posting guide
> http://www.Rproject.org/postingguide.html> and provide commented, minimal, selfcontained, reproducible code.
>
[[alternative HTML version deleted]]
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/rhelpPLEASE do read the posting guide http://www.Rproject.org/postingguide.htmland provide commented, minimal, selfcontained, reproducible code.


Hi
Have a look at the write.fwf ( fixed width format) in gdata package.
> ### load package
> library(gdata)
>
> ### Create a sample data matrix
> set.seed(4324)
> myMat < matrix(rnorm(9), 3,3)
>
> ### cannot get it tp work with matrix so cast to dataframe
> write.fwf(as.data.frame(myMat), file = "", sep = "", colnames = FALSE)
0.64648570.62897090.3129283
1.43429410.63782521.6057577
0.6456513 0.24813841.1617556
>
> ### same as before
> write.fwf(as.data.frame(myMat), file = "", width = c(10,10,10), sep = "", colnames = FALSE)
0.64648570.62897090.3129283
1.43429410.63782521.6057577
0.6456513 0.24813841.1617556
>
> ### rounding
> write.fwf(as.data.frame(round(myMat, 6)), file = "", width = rep(9, ncol(myMat)), sep = "", colnames = FALSE)
0.6464860.6289710.312928
1.4342940.6378251.605758
0.645651 0.2481381.161756
>
With this approach I don't think you can get rid of the space between positive numbers because there should be place for a minus sign for negative values. If that's what you want????
Yours sincerely / Med venlig hilsen
Frede Aakmann Tøgersen
Specialist, M.Sc., Ph.D.
Plant Performance & Modeling
Technology & Service Solutions
T +45 9730 5135
M +45 2547 6050
[hidden email]
http://www.vestas.comCompany reg. name: Vestas Wind Systems A/S
This email is subject to our email disclaimer statement.
Please refer to www.vestas.com/legal/notice
If you have received this email in error please contact the sender.
> Original Message
> From: [hidden email] [mailto: [hidden email]]
> On Behalf Of jim holtman
> Sent: 11. april 2014 22:39
> To: Doran, Harold
> Cc: [hidden email]
> Subject: Re: [R] Save file as Fixed Width using sprintf()
>
> Try this. It creates a 'list' that are the parameters for sprintf. It
> writes out the file that I attach as the dump:
>
> ### Create a sample data matrix
> myMat < matrix(rnorm(9), 3,3)
>
> # create the format required  make sure it is wide enough
> # for 'fixed' width
> xx < paste(rep("%8.2f", ncol(myMat)), collapse = '')
> # create a list for 'do.call(sprintf'
> callList < vector('list', ncol(myMat) + 1)
> callList[[1]] < xx # store in the format
>
> # add the columns to the list
> for (i in seq(ncol(myMat))) callList[[i + 1L]] < myMat[, i]
> callList # print it out
>
> result < do.call(sprintf, callList)
>
> # write out the data to a file
> writeLines(result, '/temp/file.txt')
>
>
> Here is what is in the file:
>
> 0.39 0.45 0.44
> 0.82 0.68 0.43
> 2.05 0.85 0.61
>
>
>
> Jim Holtman
> Data Munger Guru
>
> What is the problem that you are trying to solve?
> Tell me what you want to do, not how you want to do it.
>
>
> On Fri, Apr 11, 2014 at 2:48 PM, Doran, Harold < [hidden email]> wrote:
>
> > I have working code to write a file out as fwf as shown below. I have one
> > question to try and automate this I cannot get to work.
> >
> > I am generating thousands of data files for a simulation to be run outside
> > of R and each file varies in its dimensions. So I am trying to write code
> > that can write the fwf based on the dimensions of each file generated as
> > shown below. I have commented this code with an example to show
> where I am
> > stuck.
> >
> > ### Create a sample data matrix
> > myMat < matrix(rnorm(9), 3,3)
> >
> > ### Create the vector of format strings to be equal to the length of the
> > columns in myMat
> > aa < rep('%4f', ncol(myMat))
> > xx < paste(aa, sep='', collapse='')
> >
> > ### Now I could just do this below and it works
> > (out < sprintf(xx, myMat[, 1], myMat[, 2], myMat[, 3]) )
> > out < as.matrix(out) # convert to a character matrix
> > dimnames(out) < list(rep('', nrow(out)), '') # blank row and column names
> > noquote(out) ## sink this file to a directory
> >
> > But, the fact that the dimensions of my matrix vary at each iteration
> > means I need to automate this part in the sprint().
> >
> > myMat[, 1], myMat[, 2], myMat[, 3])
> >
> > I think that's needed because something like the following does not work
> >
> > (out < sprintf(xx, myMat[, 1:3]) )
> >
> >
> > So, I thought about trying smoething like this
> > cols < paste(paste('myMat[, ', 1:ncol(myMat), sep=''), ']', sep='')
> > cols < paste(cols, collapse=', ')
> >
> > But, this is a string with quotation marks, so I thought using cat() might
> > work, but it does not
> >
> > (out < sprintf(xx, cat(cols) ) )
> >
> > Anyone have a suggestion for the right way to do this, this is getting
> > messy.
> >
> > Thank
> > Harold
> >
> > [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > [hidden email] mailing list
> > https://stat.ethz.ch/mailman/listinfo/rhelp> > PLEASE do read the posting guide
> > http://www.Rproject.org/postingguide.html> > and provide commented, minimal, selfcontained, reproducible code.
> >
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/rhelp> PLEASE do read the posting guide http://www.Rproject.org/posting> guide.html
> and provide commented, minimal, selfcontained, reproducible code.
______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/rhelpPLEASE do read the posting guide http://www.Rproject.org/postingguide.htmland provide commented, minimal, selfcontained, reproducible code.

