[R] Multiple selection, renaming and saving the results

David Winsemius dwinsemius at comcast.net
Sat Nov 26 03:33:12 CET 2011


On Nov 25, 2011, at 12:50 PM, Robin Corrià wrote:

>
>
>
> Dear all,
>
> I have a
> big data frame:
>
>
> str(data1)
>
> 'data.frame':   18272 obs. of  11 variables:
>
> $ tag  :
> int  100001 100002 100003 100005 100007
> 100008 100009 100011 100012 100014 ...
>
> $ sp   :
> Factor w/ 18 levels "acassp","acocar",..: 13 5 7 14 14 18 3
> 11 13 10 ...
>
> $ gx   :
> num  20 10 35 68 88 63 123 115 137 136
> ...
>
> $ gy   :
> num  30 25 24 1 10 40 45 25 23 45 ...
>
> $ d0   :
> int  0 0 0 0 0 0 0 0 0 0 ...
>
> $ d1   :
> int  395 395 395 395 395 395 395 395 395
> 395 ...
>
> $ d2   :
> int  751 751 751 751 751 751 751 751 751
> 751 ...
>
> $ d3   :
> int  1515 1515 1515 1515 1515 1515 1515
> 1515 1515 1515 ...
>
> $ d4   :
> int  2562 2562 2562 2562 2562 2562 2562
> 2562 2562 2562 ...
>
> $ block: int
> 1 1 1 1 1 1 1 1 1 1 ...
>
> $ treat: Factor w/ 4 levels
> "I","M","N","T": 1 1 1 1 1 1 1 1 1 1
> ...
>
>
> And I need to
> do multiple selections of gx and gy for all the levels of: sp,  
> block, treat, and when d0!="NA". Then
> calculate some spatial functions with the selected gx and gy  
> coordinates, and
> save the results with a name according to the selection.
>
>
> One single
> selection could be done and named like that:
>
> acocar1I=subset(data1,(treat=="I"
> & data1$block==1 & data1$sp=="acocar" & data1$d0!="NA"))

You should watch out since that is not a valid test for NA. If the  
values are NA rahter than "NA" you need to use !is.na()

You could set up a condition list which would really be a list of  
logical vectors and then loop through it like this:

consList[[1]] <- with(data1, treat=="I"&
                              block==1 &
                              sp=="acocar" &
                              d0!="NA")

(Then add more vectors to the list.)

for (cond in condList) { sel.spp[[i]] <- with(
                                             subset(data1,  
condList[[i]]),
                                                  spp(x=gx, y=gy,  
window=wA) )

                           acocar1I.dp[[i]] <-dval(sel.spp[[i]],  
25,2.5,18,20)
                           }

(You could then assemble the various calculations in a dataframe. All  
of this obviously untested.)

If you really are doing this for "all levels of sp, bloc, treat then  
there might be further option in the plyr pkg or with aggregate since  
they provide features for running through all existing combinations  
using the interaction function. The `expand.grid` function is  
sometimes useful for building data.frames as scaffolding to hold  
repeated calculations.

-- 
David.


>
>
> These are some
> of the functions I have to calculate:
>
> acocar1I.spp<-spp(x=acocar1I$gx,
> y=acocar1I$gy, window=wA)
>
> acocar1I.dp<-dval(acocar1I.spp,25,2.5,18,20)
>
>
> And I want
> to create a 'results' object to access easily all the results:
>
> acocar1I.res<-alist()
>
> acocar1I.res$data1<-acocar1I
>
> acocar1I.res$spp<-acocar1I.spp
>
> acocar1I.res$dp<-acocar1I.dp
>
>
> Can I do everything
> in a single loop or a single function?

Depends on specifics.
>
> Many
> thanks!
>
>
>
>
>
>
>
>
>
>
>
> 		 	   		
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> 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.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list