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 ______________________________________________ [hidden email] 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. |
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 > >______________________________________________ >[hidden email] 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 [hidden email] ______________________________________________ [hidden email] 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. |
In reply to this post by Michael Rennie-3
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.039290594 Hi 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 ______________________________________________ [hidden email] 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. |
In reply to this post by Michael Rennie-3
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 <[hidden email]> 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 > > ______________________________________________ > [hidden email] 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/ ______________________________________________ [hidden email] 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's explanation of rownames makes a lot more sense than my
speculation about conversion to numeric. Rownames of dataframes is an area in which there have definitely been changes in R in the last year or two, give or take. (I don't recall details or timing) Therefore, I find it very plausible that in R 2.8.x the rownames of your dataframe were different than they are now in R 2.10.x, given how you constructed the dataframe. This then would be the explanation of why the script worked in 2.8.x and not in 2.10.x. -Don At 8:57 PM -0700 3/16/10, Joshua Wiley wrote: >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 <[hidden email]> 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 >> >> ______________________________________________ >> [hidden email] 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/ > >______________________________________________ >[hidden email] 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 [hidden email] ______________________________________________ [hidden email] 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. |
Thanks everyone for your assistance with this! Very much appreciated, and the students of my statistics course will also be pleased to have a fix ;) Mike Don MacQueen wrote: > Joshua's explanation of rownames makes a lot more sense than my > speculation about conversion to numeric. Rownames of dataframes is an > area in which there have definitely been changes in R in the last year > or two, give or take. (I don't recall details or timing) > > Therefore, I find it very plausible that in R 2.8.x the rownames of > your dataframe were different than they are now in R 2.10.x, given how > you constructed the dataframe. This then would be the explanation of > why the script worked in 2.8.x and not in 2.10.x. > > -Don > > At 8:57 PM -0700 3/16/10, Joshua Wiley wrote: >> 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 <[hidden email]> >> 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 >>> >>> ______________________________________________ >>> [hidden email] 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/ >> >> ______________________________________________ >> [hidden email] 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. > > ______________________________________________ [hidden email] 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. |
Free forum by Nabble | Edit this page |