Robin Corrià
2011-Nov-25 17:50 UTC
[R] Multiple selection, renaming and saving the results
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")) 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? Many thanks! [[alternative HTML version deleted]]
David Winsemius
2011-Nov-26 02:33 UTC
[R] Multiple selection, renaming and saving the results
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