[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