Michael Rennie
2010-Mar-17 02:53 UTC
[R] Are loops handled differently in newer versions of R?
Hi gang,
I'm perplexed- I have some code that uses for() loops that works fine in
R version 2.8 on my mac, worked fine in version 2.8 on my old windows
machine, but doesn't work in version 2.10 on windows.
The loop implements a function over a data frame (code is included below).
In Mac (running version 2.8), the results of the loop are what I expect:
> p_unadj
[1] 0.034939481 0.015743706 0.089287030 0.001098538 0.039290594
But in Windows (running version 2.10.1), I get a bunch of NA's...
> p_unadj
A B C D E
NA NA NA NA NA
If I had to guess, I'd say that R v. 2.10 is handling the i in
lab8.dat[,1] differently, given that it's keeping the row names in the
output for p_unadj... but why would that stop it from applying the
function?
Any thoughts or suggestions are welcome.
Cheers,
Mike
Here's the code...
#build the dataset
locn<-c("A", "B", "C", "D",
"E")
n<-c(28, 14, 21, 52, 35)
corr.r<-c(0.40, 0.63, 0.38, 0.44, 0.35)
lab8.dat<-data.frame(locn, n, corr.r)
lab8.dat
attach(lab8.dat)
#write the function
calc.prob.t<-function(n, r)
#given a sample size (n) and correlation coefficient (r), returns the
probability for that test
{
df<-n-2
t<-(r-0)/(sqrt((1-r2)/df))
probt<-2*(pt(t, df, lower.tail=FALSE))
probt
}
#try out the function...
calc.prob.t(lab8.dat$n[1], lab8.dat$corr.r[1])
#it works.
#write a loop to implement that function for every correlation in your
dataset...
p_unadj<-numeric(length(lab8.dat[,1]))
p_unadj<-NULL
p_unadj
#all this just built an empty vector to store the results of our loop...
for ( i in lab8.dat[,1] )
p_unadj[i]<-calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
p_unadj
#if executed on my Mac, running R v.2.8, this works (and did using 2.8
on my old windows machine). Running v. 2.10 in Windows, I get NAs.
--
Michael D. Rennie, Ph.D.
Postdoctoral Fellow, Environmental and Life Sciences Program
Trent University
2140 East Bank Drive, DNA Building (2nd Floor)
Peterborough, Ontario K9J 7B8
Vox:705.755.2287 Fax:705.755.1559
www.people.trentu.ca/michaelrennie
Don MacQueen
2010-Mar-17 03:30 UTC
[R] Are loops handled differently in newer versions of R?
Try
for ( i in seq(nrow(lab8.dat)) )
p_unadj[i]<-calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
The first column of lab8.dat is a factor, and you're trying to use it
as a loop index as if it were an integer. (Which I would consider
dangerous.)
No, loops are not handled differently, but automatic conversion of
factors to numeric apparently is.
-Don
At 10:53 PM -0400 3/16/10, Michael Rennie wrote:>Hi gang,
>
>I'm perplexed- I have some code that uses for() loops that works
>fine in R version 2.8 on my mac, worked fine in version 2.8 on my
>old windows machine, but doesn't work in version 2.10 on windows.
>
>The loop implements a function over a data frame (code is included below).
>
>In Mac (running version 2.8), the results of the loop are what I expect:
>
>> p_unadj
>[1] 0.034939481 0.015743706 0.089287030 0.001098538 0.039290594
>
>But in Windows (running version 2.10.1), I get a bunch of NA's...
>
>> p_unadj
> A B C D E
>NA NA NA NA NA
>
>If I had to guess, I'd say that R v. 2.10 is handling the i in
>lab8.dat[,1] differently, given that it's keeping the row names in
>the output for p_unadj... but why would that stop it from applying
>the function?
>
>Any thoughts or suggestions are welcome.
>
>Cheers,
>
>Mike
>
>Here's the code...
>
>
>#build the dataset
>
>locn<-c("A", "B", "C", "D",
"E")
>n<-c(28, 14, 21, 52, 35)
>corr.r<-c(0.40, 0.63, 0.38, 0.44, 0.35)
>
>lab8.dat<-data.frame(locn, n, corr.r)
>lab8.dat
>
>attach(lab8.dat)
>
>#write the function
>
>calc.prob.t<-function(n, r)
>#given a sample size (n) and correlation coefficient (r), returns
>the probability for that test
> {
> df<-n-2
> t<-(r-0)/(sqrt((1-r2)/df))
> probt<-2*(pt(t, df, lower.tail=FALSE))
> probt
> }
>
>#try out the function...
>calc.prob.t(lab8.dat$n[1], lab8.dat$corr.r[1])
>#it works.
>
>#write a loop to implement that function for every correlation in
>your dataset...
>
>
>p_unadj<-numeric(length(lab8.dat[,1]))
>p_unadj<-NULL
>p_unadj
>
>#all this just built an empty vector to store the results of our loop...
>
>for ( i in lab8.dat[,1] )
> p_unadj[i]<-calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
>
>p_unadj
>
>#if executed on my Mac, running R v.2.8, this works (and did using
>2.8 on my old windows machine). Running v. 2.10 in Windows, I get
>NAs.
>
>--
>Michael D. Rennie, Ph.D.
>Postdoctoral Fellow, Environmental and Life Sciences Program
>Trent University
>2140 East Bank Drive, DNA Building (2nd Floor)
>Peterborough, Ontario K9J 7B8
>Vox:705.755.2287 Fax:705.755.1559
>www.*people.trentu.ca/michaelrennie
>
>______________________________________________
>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.
--
---------------------------------
Don MacQueen
Lawrence Livermore National Laboratory
Livermore, CA, USA
925-423-1062
macq at llnl.gov
Michael Bibo
2010-Mar-17 03:51 UTC
[R] Are loops handled differently in newer versions of R?
Michael Rennie <mdrennie <at> gmail.com> writes:> > > Hi gang, > > I'm perplexed- I have some code that uses for() loops that works fine in > R version 2.8 on my mac, worked fine in version 2.8 on my old windows > machine, but doesn't work in version 2.10 on windows. > > The loop implements a function over a data frame (code is included below). > > In Mac (running version 2.8), the results of the loop are what I expect: > > > p_unadj > [1] 0.034939481 0.015743706 0.089287030 0.001098538 0.039290594Hi Michael, I'm not sure what the mac is doing, but if you change the syntax of the loop as follows it gives the same answers:> for ( i in 1:length(lab8.dat[,1]) )+ p_unadj[i]<-calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])> p_unadj[1] 0.034939481 0.015743706 0.089287030 0.001098538 0.039290594 Hope this helps, Michael Bibo, Queensland Health
Joshua Wiley
2010-Mar-17 03:57 UTC
[R] Are loops handled differently in newer versions of R?
Michael,
I have to agree with Don that using a factor as a loop index seems
like a risky choice. At any rate, part of the problem is that you are
referencing a nonexistant part of your dataframe. i is an index of
characters, but your rownames are 1:5, not LETTERS[1:5]. If you give
your dataframe rownames, you can then use your loop, see below.
########################
locn<-c("A", "B", "C", "D",
"E")
n<-c(28, 14, 21, 52, 35)
corr.r<-c(0.40, 0.63, 0.38, 0.44, 0.35)
lab8.dat<-data.frame(locn, n, corr.r)
lab8.dat
calc.prob.t<-function(n, r)
{
df<-n-2
t<-(r-0)/(sqrt((1-r^2)/df)) # I'm assuming you mean r^2 here not r2
probt<-2*(pt(t, df, lower.tail=FALSE))
probt
}
p_unadj<-NULL # since you assign it to null anyways, there's not real
point in the other assignment
p_unadj
for ( i in lab8.dat[,1] )
p_unadj[i] <- calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
p_unadj # all NAs as you noticed
rownames(lab8.dat) <- lab8.dat$locn
for ( i in lab8.dat[,1] )
p_unadj[i] <- calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
p_unadj # now lab8.dat["A",2] etc. means something, and it works
##############################
On Tue, Mar 16, 2010 at 7:53 PM, Michael Rennie <mdrennie at gmail.com>
wrote:>
> Hi gang,
>
> I'm perplexed- I have some code that uses for() loops that works fine
in R
> version 2.8 on my mac, worked fine in version 2.8 on my old windows
machine,
> but doesn't work in version 2.10 on windows.
>
> The loop implements a function over a data frame (code is included below).
>
> In Mac (running version 2.8), the results of the loop are what I expect:
>
>> p_unadj
> [1] 0.034939481 0.015743706 0.089287030 0.001098538 0.039290594
>
> But in Windows (running version 2.10.1), I get a bunch of NA's...
>
>> p_unadj
> ?A ? B ? ? ?C ? ?D ? ?E
> NA NA NA NA NA
>
> If I had to guess, I'd say that R v. 2.10 is handling the i in
lab8.dat[,1]
> differently, given that it's keeping the row names in the output for
> p_unadj... but why would that stop it from applying the function?
>
> Any thoughts or suggestions are welcome.
>
> Cheers,
>
> Mike
>
> Here's the code...
>
>
> #build the dataset
>
> locn<-c("A", "B", "C", "D",
"E")
> n<-c(28, 14, 21, 52, 35)
> corr.r<-c(0.40, 0.63, 0.38, 0.44, 0.35)
>
> lab8.dat<-data.frame(locn, n, corr.r)
> lab8.dat
>
> attach(lab8.dat)
>
> #write the function
>
> calc.prob.t<-function(n, r)
> #given a sample size (n) and correlation coefficient (r), returns the
> probability for that test
> ? ?{
> ? ?df<-n-2
> ? ?t<-(r-0)/(sqrt((1-r2)/df))
> ? ? ? ?probt<-2*(pt(t, df, lower.tail=FALSE))
> ? ?probt
> ? ?}
>
> #try out the function...
> calc.prob.t(lab8.dat$n[1], lab8.dat$corr.r[1])
> #it works.
>
> #write a loop to implement that function for every correlation in your
> dataset...
>
>
> p_unadj<-numeric(length(lab8.dat[,1]))
> p_unadj<-NULL
> p_unadj
>
> #all this just built an empty vector to store the results of our loop...
>
> for ( i in lab8.dat[,1] )
> ? ? ? ?p_unadj[i]<-calc.prob.t(lab8.dat[i,2], lab8.dat[i,3])
>
> p_unadj
>
> #if executed on my Mac, running R v.2.8, this works (and did using 2.8 on
my
> old windows machine). Running v. 2.10 in Windows, I get NAs.
>
> --
> Michael D. Rennie, Ph.D.
> Postdoctoral Fellow, Environmental and Life Sciences Program
> Trent University
> 2140 East Bank Drive, DNA Building (2nd Floor)
> Peterborough, Ontario K9J 7B8
> Vox:705.755.2287 Fax:705.755.1559
> www.people.trentu.ca/michaelrennie
>
> ______________________________________________
> 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.
>
--
Joshua Wiley
Senior in Psychology
University of California, Riverside
http://www.joshuawiley.com/