[R] Outputing multilple subsets

David Winsemius dwinsemius at comcast.net
Mon Nov 9 15:33:33 CET 2009


On Nov 9, 2009, at 8:45 AM, rusers.sh wrote:

> Hi Johann,
> Excellent. That is what i really want. A little problem is why the  
> "c.n"
> does not exist. Should the "c.n" in the memory? Sometimes, i also  
> hope to
> see "c.n" directly in R besides exporting. Could i see the  "c.n"  
> with some
> function in the loops?

>> a<-c(1:10)
>> b<-c(rep(1,3),rep(2,3),rep(3,4))
>> c<-data.frame(a,b)  #c is the example data

And not a particularly good choice for a variable name by virtue of  
potential "wetware confusion" with the concatenate function, c(.)


>> num<-c(unique(b))
>> for (n in num) {
> +  c.n <- c[c$b==n,]
> +  write.csv(c.n, file=paste("c:/c_", n, ".csv", sep=""))}

>> num
> [1] 1 2 3
>> c.1
> Error: object 'c.1' not found

And you were apparently expecting variables "c.1", "c.2", and "c.3" to  
be constructed in that loop? That is way beyond the R-interpreter's  
currently level of integration with the device drivers reading input  
from the electroencephalograph that must be sitting on your machine.

Perhaps you could have succeeded with:

dftemp <- list() # outside the loop, need a list because results of  
the extract operation will be a df.
..........
dftemp[[n]] <- c[c$b == n, ]  # inside the loop
   write.csv(dftemp[[n]], file=paste("c:/c_", n, ".csv", sep=""))}

The fact that you immediately wrote it to a file that did not store  
its name would make creation of a list unnecessary inside the loop,  
but it would store the results in a form that could be examined later  
from the command line.


>> c.2
> Error: object 'c.2' not found
>> c.3
> Error: object 'c.3' not found
>
> Thanks a lot.
> -----------------
> Jane Chang
> Queen's
>
>
>
> 2009/11/9 Johann Hibschman <johannh at gmail.com>
>
>> On Nov 8, 2009, at 7:23 PM, rusers.sh wrote:
>>
>> for (i in num)  {
>>> c_num<-c[c$b==num,]
>>> write.csv(c_num,file="c:/c_num.csv")
>>> }
>>>
>>> Warning messages:
>>> 1: In c$b == num :
>>> longer object length is not a multiple of shorter object length
>>>
>>
>> This is because you're comparing column b to the entire vector of  
>> numbers
>> (num), not the current number in the iteration (i).  The first line  
>> of the
>> loop should be "c_num<-c[c$b==i,]".
>>
>> From a style point of view, I'd use "n" as my variable, since "i"  
>> is too
>> commonly used as an integer index.
>>
>> Also, you will be overwriting the same file, called "c_num.csv", on  
>> each
>> iteration.
>>
>> You should try something more like:
>>
>> for (n in num) {
>> c.n <- c[c$b==n,]
>> write.csv(c.n, file=paste("c:/c_", n, ".csv", sep="")
>> }
>>
>> I hope that helps.
>>
>> Cheers,
>> Johann Hibschman
>>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list