[R] if clause in data frame

David Winsemius dwinsemius at comcast.net
Fri Mar 29 21:51:38 CET 2013


On Mar 29, 2013, at 1:48 PM, arun wrote:

> Yes, that is better.
> 
> I just copied the same function that the OP used.
> A.K.
> 
> ________________________________
> From: David Winsemius <dwinsemius at comcast.net>
> To: arun <smartpink111 at yahoo.com> 
> Cc: Joanna Zhang <zjoanna2013 at gmail.com>; R help <r-help at r-project.org> 
> Sent: Friday, March 29, 2013 4:46 PM
> Subject: Re: [R] if clause in data frame
> 
> 
> On Mar 29, 2013, at 10:47 AM, arun wrote:
> 
>> Hi,
>> 
>> 
>> final<-data.frame()
>>     for (m1 in 4:10) {
>>         for (n1 in 4:10){  
>>             for (x1 in 0: m1) {
>>                for (y1 in 0: n1) {
>> 
>> final<- rbind(final,c(m1,n1,x1,y1))
>> res}}}}
>>   final1<-within(final,{flag<-ifelse(x1/m1>y1/n1, 1,0)})
> 
> That looks likely to be extremely slow. 'rbind.data.frame' is notoriously slow when applied iteratively in loops.
> 
> Couldn't this just be:
> 
> dat <- expand.grid(m1 = 4:10, n1 = 4:10, x1 = 0: m1, y1 = 0: n1) 
> final= within(dat, flag=as.numeric( x1/m1>y1/n1) )

This may be one of those instances where "=" is not an acceptable replacement for "<-". I get an error with that code whereas I get the desired result with:

> final= within(dat, flag <- as.numeric( x1/m1>y1/n1) )


> 
> -- 
> David.
> 
>>   head(final1)
>> #  m1 n1 x1 y1 flag
>> #1  4  4  0  0    0
>> #2  4  4  0  1    0
>> #3  4  4  0  2    0
>> #4  4  4  0  3    0
>> #5  4  4  0  4    0
>> #6  4  4  1  0    1
>> 
>> 
>> Also, just by looking at your code, you have "flag" and "flap".
>> 
>> A.K.
>> 
>> ________________________________
>> From: Joanna Zhang <zjoanna2013 at gmail.com>
>> To: arun <smartpink111 at yahoo.com> 
>> Sent: Friday, March 29, 2013 10:56 AM
>> Subject: if clause in data frame
>> 
>> 
>> Why the if clause code not working here?
>> 
>> final<-data.frame()
>>     for (m1 in 4:10) {
>>         for (n1 in 4:10){  
>>             for (x1 in 0: m1) {
>>                for (y1 in 0: n1) {
>> 
>> if (x1/m1>y1/n1)  { flag<-1}
>> else {flap<-0}
>> 
>> final<-rbind(final, c(m1,n1,flag, x1,y1))
>> }}
>> }}
>> colnames(final)<-c("m1","n1","flag","x1","y1") 
>> final
>> 

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list