Hi Simon,

On Mon, Mar 12, 2012 at 2:37 PM, Simon Kiss <sjk...@gmail.com> wrote:
> Hi: I'm sure this is a very easy problem. I've consulted Data Manipulation 
> With R and the R Book and can't find an answer.
>
> Sample list of data frames looks as follows:
>
> .xx<-list(df<-data.frame(Var1=rep('Alabama', 400), Var2=rep(c(2004, 2005, 
> 2006, 2007), 400)), df2<-data.frame(Var1=rep('Tennessee', 400), 
> Var2=rep(c(2004,2005,2006,2007), 400)), df3<-data.frame(Var1=rep('Alaska', 
> 400), Var2=rep(c(2004,2005,2006,2007), 400)) )

I tweaked this a bit so that it doesn't actually create df, df2, df3 as well as
making a list of them, and so that xx doesn't begin with a . and shows up with
ls(). I don't need invisible objects in my testing session.

xx<-list(df=data.frame(Var1=rep('Alabama', 400), Var2=rep(c(2004,
2005, 2006, 2007), 400)), df2=data.frame(Var1=rep('Tennessee', 400),
Var2=rep(c(2004,2005,2006,2007), 400)),
df3=data.frame(Var1=rep('Alaska', 400),
Var2=rep(c(2004,2005,2006,2007), 400)) )


> I would like to accomplish the following two tasks.
> First, I'd like to go through and change the names of each of the data frames 
> within the list
> to be 'State' and 'Year'
>
> Second, I'd like to go through and add one year to each of the 'Var2'  
> variables.
>
> Third, I'd like to then delete those cases in the data frames that have 
> values of Var2 (or Year) values of 2008.
>
> I could do this manually, but my data are actually bigger than this, plus I'd 
> really like to learn. I've been trying to use lapply, but I can't get my head 
> around how it works:
>  .xx<- lapply(.xx, function(x) colnames(x)<-c('State', 'Year')
> just changes the actual list of data frames to a list of the character string 
> ('State' and 'Year')  How do I actually change the underlying variable names?

Your function doesn't return the right thing. To see how it works, it's often a
good idea to write a stand-alone function and see what it does. For instance,

rename <- function(x) {
   colnames(x)<-c('State', 'Year')
   x
}

To me at least, as soon as it's written as a stand-alone it's obvious that
you have to return x in the last line. You can either use rename() in your
lapply statement:
xx<- lapply(xx, rename)

or you can write the full function into the lapply statement:
> xx<-list(df=data.frame(Var1=rep('Alabama', 400), Var2=rep(c(2004, 2005, 2006, 
> 2007), 400)), df2=data.frame(Var1=rep('Tennessee', 400), 
> Var2=rep(c(2004,2005,2006,2007), 400)), df3=data.frame(Var1=rep('Alaska', 
> 400), Var2=rep(c(2004,2005,2006,2007), 400)) )
> xx <- lapply(xx, function(x){ colnames(x)<-c('State', 'Year'); x} )
> colnames(xx[[1]])
[1] "State" "Year"

The same strategy should work for your other needs as well.

Sarah



-- 
Sarah Goslee
http://www.functionaldiversity.org

______________________________________________
R-help@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.

Reply via email to