[R] Filling Lists or Arrays of variable dimensions

Chris Campbell ccampbell at mango-solutions.com
Thu Dec 20 15:48:37 CET 2012


Dear Jessica

Aggregate is a function that allows you to perform loops across multiple variables.
   
tempData <- data.frame(height = rnorm(20, 100, 10),  
    width = rnorm(20, 50, 5),  
    par1 = rnorm(20))  
   
tempData$htfac <- cut(tempData$height, c(0, 100, 200))   
tempData$wdfac <- cut(tempData$width, c(0, 50, 100))   
   
doSomething <- function(x) { mean(x) }  
   
out <- aggregate(tempData["par1"], tempData[c("htfac", "wdfac")], doSomething)  

# out is a data frame; this is a named list.   
# use as.list to remove the data.frame class   

> as.list(out)  
   
$htfac   
[1] (0,100]   (100,200] (0,100]   (100,200]    
Levels: (0,100] (100,200]   
   
$wdfac   
[1] (0,50]   (0,50]   (50,100] (50,100]   
Levels: (0,50] (50,100]   
   
$par1    
[1] -1.0449563 -0.3782483 -0.9319105  0.8837459    
    


I believe you are seeing an error similar to this one:
  
> out[[1:3]] <- 1  
Error in `[[<-`(`*tmp*`, i, value = value) :   
  recursive indexing failed at level 2  
   
This is because double square brackets for lists can only set a single list element at once; grid[1, ] is longer.

Happy Christmas

Chris


Chris Campbell
Tel. +44 (0) 1249 705 450 | Mobile. +44 (0) 7929 628 349
mailto:ccampbell at mango-solutions.com | http://www.mango-solutions.com
Mango Solutions
2 Methuen Park
Chippenham
Wiltshire 
SN14 OGB
UK

-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Jessica Streicher
Sent: 20 December 2012 12:46
To: R help
Subject: [R] Filling Lists or Arrays of variable dimensions

Following problem:

Say you have a bunch of parameters and want to produce results for all combinations of those:

height<-c("high","low")
width<-c("slim","wide")

then what i used to do was something like this:

l<-list()
for(h in height){
	l[[h]]<-list()
	for(w in width){
		l[[h]][[w]] <- doSomething()
	}
}

Now those parameters aren't always the same. Their number can change and the number of entries can change, and i'd like to have one code that can handle all configurations.

Now i thought i could use expand.grid() to get all configurations ,and than iterate over the rows, but the problem then is that i cannot set the values in the list like above.

grid<-expand.grid(height,width)
l[[as.character(grid[1,])]] <-1
Error in `[[<-`(`*tmp*`, as.character(grid[1, ]), value = 1) : 
  no such index at level 1

 This will only work if the "path" for that is already existent, and i'm not sure how to build that in this scenario. 

I then went on and built an array instead lists of lists, but that doesn't help either because i can't access the array with what i have in the grids row - or at least i don't know how.

Any ideas?

I'd prefer to keep the named lists since all other code is built towards this.
______________________________________________
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.

--

LEGAL NOTICE\ \ This message is intended for the use of ...{{dropped:18}}




More information about the R-help mailing list