[R] Are loops handled differently in newer versions of R?

Michael Rennie mdrennie at gmail.com
Wed Mar 17 13:19:17 CET 2010


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 <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/
>>
>> ______________________________________________
>> 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