Save file as Fixed Width using sprintf()

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Save file as Fixed Width using sprintf()

Doran, Harold
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/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Save file as Fixed Width using sprintf()

arun kirshna


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/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: Save file as Fixed Width using sprintf()

jholtman
In reply to this post by Doran, Harold
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/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: Save file as Fixed Width using sprintf()

Frede Aakmann Tøgersen-2
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.6464857-0.6289709-0.3129283
 1.4342941-0.6378252-1.6057577
 0.6456513 0.2481384-1.1617556
>
> ### same as before
> write.fwf(as.data.frame(myMat), file = "", width = c(10,10,10), sep = "", colnames = FALSE)
-0.6464857-0.6289709-0.3129283
 1.4342941-0.6378252-1.6057577
 0.6456513 0.2481384-1.1617556
>
> ### rounding
> write.fwf(as.data.frame(round(myMat, 6)), file = "", width = rep(9, ncol(myMat)), sep = "", colnames = FALSE)
-0.646486-0.628971-0.312928
 1.434294-0.637825-1.605758
 0.645651 0.248138-1.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.com

Company reg. name: Vestas Wind Systems A/S
This e-mail is subject to our e-mail disclaimer statement.
Please refer to www.vestas.com/legal/notice
If you have received this e-mail 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/r-help
> > PLEASE do read the posting guide
> > http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] 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.

______________________________________________
[hidden email] 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.