[R] for loop

Petr PIKAL petr.pikal at precheza.cz
Mon Nov 1 11:41:59 CET 2010


Hi


r-help-bounces at r-project.org napsal dne 31.10.2010 09:59:00:

> Hi Dennis, 
> 
> 
> 
> Thank you for your extensive explanations. Yes, I guess I did not 
explain what
> I would like to do.
> 
> Basically I would like to conduct a linear regression for each of 15 
classes. 

In that case you can also use a nlme package. However I would strongly 
recommend a Pinheiro-Bates book which accompanies this package for 
complete utilisation the power of nlme package.

Or you can convert your column with values 1-15 to factor and call simple 
linear model

fit<-lm(y~x+factor.column, data=razred)

Regards
Petr


> Your answers gave me new
> 
> Perspective on how R works. 
> 
> 
> 
> Thanks again for the help, 
> 
> m
> 
> 
> 
> From: Dennis Murphy [mailto:djmuser at gmail.com] 
> Sent: Sunday, October 31, 2010 4:40 AM
> To: MatevĹľ PavliÄŤ
> Cc: r-help at r-project.org
> Subject: Re: [R] for loop
> 
> 
> 
> Hi:
> 
> If your objective is to make 15 plots, one for each level of razred, 
then you 
> don't need to make 15 individual data frames first. The lattice and 
ggplot2 
> packages allow conditioning plots. You haven't mentioned what types of 
plots 
> you're interested in getting, but if it's something simple like a 
scatterplot 
> of y vs. x for each level of razred, it's not that hard to do. Let's 
fake some data:
> 
> d <- data.frame(razred = rep(LETTERS[1:15], each = 10),
>                    x = rep(1:10, 15),
>                    y = rep(2 + 0.5 * 1:10, 15) + rnorm(150))
> 
> d has 15 levels of razred with 10 observations at each level. razred is 
a 
> factor, the other variables are either integer or numeric.
> 
> Produce scatterplots of y vs. x for each level of razred, using both the 

> lattice and ggplot2 packages:
> 
> library(lattice)
> # each plot adds a new feature - run one plot at a time.
> xyplot(y ~ x | razred, data = d, type = c('p', 'r'))
> xyplot(y ~ x | razred, data = d, type = c('p', 'r'), layout = c(3, 5))
> xyplot(y ~ x | razred, data = d, type = c('p', 'r'), layout = c(3, 5), 
as.table = TRUE)
> 
> library(ggplot2)
> ggplot(d, aes(x, y)) + geom_point() + geom_smooth(method = 'lm') +
>     facet_wrap( ~ razred, ncol = 3)
> ggplot(d, aes(x, y)) + geom_point() + geom_smooth(method = 'lm', se = 
FALSE) +
>    facet_wrap( ~ razred, ncol = 3)
> 
> If instead you want something like a scatterplot matrix for each data 
subset 
> defined by level of razred, then maybe something like this (?):
> 
> # add a new variable to the data frame
> # splom is the scatterplot matrix function in lattice
> d$z1 <- rnorm(150)
> splom(~ d[, -1] | razred, data = d, layout = c(2, 2, 4))
> 
> Just guessing here since you didn't make your objective explicit. 
> 
> It's entirely possible that you can conduct a significant part of your 
data 
> analysis without having to split the data into subsets. Several summary 
> functions, for example, can compute a number of summary functions by 
group 
> with a one-line call. Here are a couple of examples, one using 
aggregate() 
> from the base package and another using function ddply() from the plyr 
package:
> 
> aggregate(y ~ razred, data = d, FUN = mean)
>    razred        y
> 1       A 4.816841
> 2       B 4.520804
> 3       C 5.196329
> 4       D 4.615575
> 5       E 3.982240
> 6       F 4.466559
> 7       G 4.938669
> 8       H 4.539541
> 9       I 4.354991
> 10      J 4.573654
> 11      K 4.450624
> 12      L 5.138087
> 13      M 4.931111
> 14      N 4.879493
> 15      O 5.087452
> 
> library(plyr)
> ddply(d, 'razred', summarise, mx = mean(x), my = mean(y), mz1 = 
mean(z1))
>    razred  mx       my         mz1
> 1       A 5.5 4.816841 -0.01745305
> 2       B 5.5 4.520804  0.24724069
> 3       C 5.5 5.196329  0.18717750
> 4       D 5.5 4.615575  0.18885590
> 5       E 5.5 3.982240 -0.91284339
> 6       F 5.5 4.466559  0.36479266
> 7       G 5.5 4.938669 -0.36359562
> 8       H 5.5 4.539541  0.06061162
> 9       I 5.5 4.354991  0.05138409
> 10      J 5.5 4.573654  0.31160018
> 11      K 5.5 4.450624  0.17458712
> 12      L 5.5 5.138087 -0.26482357
> 13      M 5.5 4.931111 -0.39194953
> 14      N 5.5 4.879493  0.33154075
> 15      O 5.5 5.087452  0.32816931
> 
> There are a number of functions and packages that will do this sort of 
thing 
> quite well - I'll mention doBy, data.table, Hmisc and sqldf as excellent 

> options, noting that there are other packages and functions in the apply 

> family that can perform groupwise processing seamlessly. The point of 
> mentioning this is so that you don't automatically think you have to 
split the
> data in myriad ways before you can process a function. The good folks 
that 
> designed this language, and the many people who have contributed code to 
the R
> project, are pretty smart, and have devised fairly simple ways to 
process 
> data, even if it's large. 
> 
> Of course, it's always possible that splitting is necessary; if you're 
willing
> to be a little more forthcoming about your analysis goals, you might get 
a 
> better targeted response..
> 
> HTH,
> Dennis
> 
> 
> 
> On Sat, Oct 30, 2010 at 12:00 PM, MatevĹľ PavliÄŤ 
<matevz.pavlic at gi-zrmk.si> wrote:
> 
> Just one more thing...
> I get a list with 15 data.frames :
> 
> List of 15
>  $ 1:'data.frame':      7 obs. of  9 variables:
>  ..$ vrtina         : Factor w/ 6 levels "T1A-1","T1A-2",..: 1 1 2 2 5 5 
5
>  ..$ globina.meritve: num [1:7] 7.6 8.5 10.4 17.4 12.5 15.5 16.5
>  ..$ E0             : num [1:7] 4109 2533 491 810 2374 ...
>  ..$ Eur1           : num [1:7] 6194 4713 605 1473 NA ...
>  ..$ Eur2           : num [1:7] 3665 7216 266 4794 7387 ...
>  ..$ Eur3           : num [1:7] 3221 3545 920 3347 6768 ...
>  ..$ H              : num [1:7] 8 5.9 5.9 6.9 9.3 10.9 10
>  ..$ Mpl            : num [1:7] 61.9 136.7 19.9 96.4 178.5 ...
>  ..$ class          : int [1:7] 1 1 1 1 1 1 1
> .
> .
> .
> 
> But how would I acces them (i.e. to draw a plot for each data.frame for 
each 
> data.frame in a list)?
> 
> Thanks,m
> 
> 
> -----Original Message-----
> From: David Winsemius [mailto:dwinsemius at comcast.net]
> Sent: Saturday, October 30, 2010 8:24 PM
> To: MatevĹľ PavliÄŤ
> Cc: r-help at r-project.org
> Subject: Re: [R] for loop
> 
> 
> On Oct 30, 2010, at 2:07 PM, MatevĹľ PavliÄŤ wrote:
> 
> > Hi,
> >
> > I know this is probalby a very trivial thing to do for most of the R
> > users, but since I just strated using it I have some problems....
> >
> > I have a data.frame with a field called "razred". This field has
> > values from 1 up to 15.
> >
> > Is it possible to create a for loop that would create a new data frame
> > for each of the "razred" values.
> 
> The R-way would be to use the split function and leave the result in a 
list to
> which the same operation could be also repeatedly performed using 
lapply.
> 
> ?split
> 
> And take a look at the fourth example applying split to the builtin 
airqualitydataframe.
> 
> The plyr package also provides functions on dataframes.
> 
> --
> 
> David Winsemius, MD
> West Hartford, CT
> 
> ______________________________________________
> 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.
> 
> 
> 
> 
>    [[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.



More information about the R-help mailing list