[R] automatically generating and accessing data frames of varyingdimensions

Bill.Venables at csiro.au Bill.Venables at csiro.au
Fri Jul 13 07:00:53 CEST 2007


I'm not sure why you want to do it this way (it would probably help if
we had a more complete picture of what you were really trying to do, but
here are a few possibilities for the questions you ask.

1. generating data frames.

rw <- c(4,5,2)
cl <- c(3,3,3)

for(i in 1:length(rw))
	assign(paste("auto.data", i, sep="."),
		as.data.frame(array(0, dim=c(rw[i], cl[i]), 
			dimnames = list(NULL, paste("X", 1:cl[i],
sep="")))))

check: 

> auto.data.1
  X1 X2 X3
1  0  0  0
2  0  0  0
3  0  0  0
4  0  0  0
> auto.data.2
  X1 X2 X3
1  0  0  0
2  0  0  0
3  0  0  0
4  0  0  0
5  0  0  0
> auto.data.3
  X1 X2 X3
1  0  0  0
2  0  0  0

2. filling them up (... are you sure you want to do it this way?)

The simplest way is probably through an intermediary

for(nam in paste("auto.data", 1:3, sep=".")) { # loop over the names
  tmp <- get(nam)
  for(i in 1:nrow(tmp))
	for(j in 1:ncol(tmp))
	  tmp[i, j] <- i+j-i*j # 'some value'
  assign(nam, tmp)
  rm(tmp)
}

check:

> auto.data.1
  X1 X2 X3
1  1  1  1
2  1  0 -1
3  1 -1 -3
4  1 -2 -5
> auto.data.2
  X1 X2 X3
1  1  1  1
2  1  0 -1
3  1 -1 -3
4  1 -2 -5
5  1 -3 -7
> auto.data.3
  X1 X2 X3
1  1  1  1
2  1  0 -1
> 

It may work, but I have to say, though, I'm almost sure this is a
mistake.  There has to be a better way using the facilities that R
provides for avoiding heavy loops like this.

Just a hunch...

Bill Venables
CSIRO Laboratories
PO Box 120, Cleveland, 4163
AUSTRALIA
Office Phone (email preferred): +61 7 3826 7251
Fax (if absolutely necessary):  +61 7 3826 7304
Mobile:                         +61 4 8819 4402
Home Phone:                     +61 7 3286 7700
mailto:Bill.Venables at csiro.au
http://www.cmis.csiro.au/bill.venables/ 

-----Original Message-----
From: r-help-bounces at stat.math.ethz.ch
[mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Drescher, Michael
(MNR)
Sent: Friday, 13 July 2007 9:19 AM
To: r-help at stat.math.ethz.ch
Subject: [R] automatically generating and accessing data frames of
varyingdimensions

Hi All,

I want to automatically generate a number of data frames, each with an
automatically generated name and an automatically generated number of
rows. The number of rows has been calculated before and is different for
all data frames (e.g. c(4,5,2)). The number of columns is known a priori
and the same for all data frames (e.g. c(3,3,3)). The resulting data
frames could look something like this:

> auto.data.1
  X1 X2 X3
1  0  0  0
2  0  0  0
3  0  0  0
4  0  0  0

> auto.data.2
  X1 X2 X3
1  0  0  0
2  0  0  0
3  0  0  0
4  0  0  0
5  0  0  0

> auto.data.3
  X1 X2 X3
1  0  0  0
2  0  0  0

Later, I want to fill the elements of the data frames with values read
from somewhere else, automatically looping through the previously
generated data frames.

I know that I can automatically generate variables with the right number
of elements with something like this:

> auto.length <- c(12,15,6)
> for(i in 1:3) {
+ nam <- paste("auto.data",i, sep=".")
+ assign(nam, 1:auto.length[i])
+ }
> auto.data.1
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> auto.data.2
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
> auto.data.3
[1]  1 2 3 4 5 6

But how do I turn these variables into data frames or give them any
dimensions? Any commands such as 'as.matrix', 'data.frame', or 'dim' do
not seem to work. I also seem not to be able to access the variables
with something like "auto.data.i" since:

> auto.data.i
Error: object "auto.data.i" not found

Thus, how would I be able to automatically write to the elements of the
data frames later in a loop such as ...

> for(i in 1:3) {
+ for(j in 1:nrow(auto.data.i)) {	### this obviously does not work
since 'Error in nrow(auto.data.i) : object "auto.data.i" not found'
+ for(k in 1:ncol(auto.data.i)) {
+ auto.data.i[j,k] <- 'some value'
+ }}}

Thanks a bunch for all your help.

Best, Michael


Michael Drescher
Ontario Forest Research Institute
Ontario Ministry of Natural Resources
1235 Queen St East
Sault Ste Marie, ON, P6A 2E3
Tel: (705) 946-7406
Fax: (705) 946-2030

______________________________________________
R-help at stat.math.ethz.ch 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.



More information about the R-help mailing list