Thanks for your replies. I ended up using the following:
df = data.frame(year
=c(1991,1991,1992,1992,1993,1993,1992,1991),x=rnorm(8),y=rnorm(8))
df
year x y
1 1991 0.5565083 -1.31364232
2 1991 0.1686598 -0.20344656
3 1992 -0.1010090 -0.65681852
4 1992 0.6130324 -0.10788605
5 1993 -0.9061458 -0.64872139
6 1993 -0.4460332 0.07253762
7 1992 -0.3865464 -1.87445996
8 1991 0.9252679 0.14891506
dfs = split(df,df$year)
dfs[['1991']]
year x y
1 1991 0.5565083 -1.3136423
2 1991 0.1686598 -0.2034466
8 1991 0.9252679 0.1489151
dfs[['1992']]
year x y
3 1992 -0.1010090 -0.6568185
4 1992 0.6130324 -0.1078861
7 1992 -0.3865464 -1.8744600
Notice that split automatically uses a character version of the values
of the split variable to name its output.
Once you've created the list, you can use sapply or lapply
to process each piece. Let's say we wanted the regression coefficients
for the regression of y on x for each year:
regs = sapply(dfs,function(d)coef(lm(y~x,data=d)))
regs
1991 1992 1993
(Intercept) -0.6964841 -0.9456066 0.7717261
x 0.4370229 1.5752294 1.5675705
David Winsemius wrote:
On Apr 24, 2009, at 11:56 AM, Jennifer Brea wrote:
I wanted to ask how I can make a for loop or a function return an R
object with a unique name based on either some XX of the for loop or
some input for the function.
For example
if I have a function:
fn<-function(data,year){
which does does some stuff
}
How do I return an object from the function called X.year, such that
if I run fn(data,1989), the output is an object called X.1989?
Read:
?assign
?paste
#and FAQ 7.21
http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f
In a separate but related process, I'm also trying to subset data by
year, where there are multiple observations by years, using the
subset() function. For example:
data.1946<-subset(data, year==1946)
data.1947<-subset(data, year==1947)
data.1948<-subset(data, year==1948)
data.1949<-subset(data, year==1949)
...
list.of.subsets <- sapply(1946:200, function(x) subset(data, year==x)
) # with no example ... untested
Using data as a dataframe names is poor R programming practice, since
many functions use data a a parameter name and it is also a function
name.
How should I set this up? I was thinking of writing a for loop, but
I have never written a for loop that creates objects based on the
loop's index, for example a loop for(i in 1946:2000) that returns 55
objects with the object names based on the index.
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
______________________________________________
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.