[R] create an object in a loop (v4)

Ivan Calandra ivan.calandra at uni-hamburg.de
Wed Feb 3 14:28:39 CET 2010


Great, thanks a lot!
But I feel stupid... I didn't think about that easy solution. I wanted 
to change the names after...
Anyway, it now works!

Regards, Ivan



Le 2/3/2010 14:22, jim holtman a écrit :
> For adding the 'names', put the data in a temporary first:
>
> for(i in 1:length(seq.num)) {
>   k<- seq.num[i]
>   name.num<- names(file)[k]
>   temp<- fac2list(file[,k], file[3])
>   names(temp)<-  levels(factor(file[[3]]))
>   assign(paste(names(file)[3], name.num, sep="_"), temp)
> }
>                                              #I couldn't make it work
> with get() either
>
> On Wed, Feb 3, 2010 at 5:09 AM, Ivan Calandra
> <ivan.calandra at uni-hamburg.de>  wrote:
>    
>> Hi everybody,
>>
>> I have just thought that it might help if I would provide a sample data set.
>> I have attached it as a txt file (tab separated).
>>
>> Here is the "modified" code to fit this data set.
>> ----
>> library(WRS)
>> file<- read.table(file=file.choose(), header=T, sep="\t")
>> seq.num<- c(4,5)        #column (variable) indexes to be used as numerical
>> variables
>>
>> # fac2list() separates the data from file[,k] into groups from levels in
>> file[3] and store into list mode.
>> for(i in 1:length(seq.num)) {
>>   k<- seq.num[i]
>>   name.num<- names(file)[k]
>>   assign(paste(names(file)[3], name.num, sep="_"), fac2list(file[,k],
>> file[3]))
>>   names(paste(names(file)[3], name.num, sep="_"))<- levels(factor(file[[3]]))
>>   #that line doesn't work, but I would like something in this direction,
>> }
>>                                         #I couldn't make it work with get()
>> either
>> ----
>>
>> Desired output (I named it "manually"):
>>      
>>> TO_POS_Asfc.median
>>>        
>> $M1
>> [1] 143.2065 180.0317 121.6397 175.0321 196.7545 208.3876
>> $M2
>>   [1]  83.76985 190.26124  35.94771 158.67638 228.32178 247.06147  53.97887
>>   [8] 218.60500 210.73514 167.37230 311.49512
>> $M3
>>   [1] 316.37916 238.75643 277.44513 142.00038 242.58559 285.64139  61.01016
>>   [8] 353.16336 150.75096 300.15989 298.99994  74.33973
>> $P3
>> [1] 140.9876 207.7029
>> $P4
>> [1] 316.71972 120.76090  85.56545 135.87049 290.98684 160.52683
>>
>>      
>>> TO_POS_Smc.median
>>>        
>> $M1
>> [1]  6.411332 31.347971  5.649655  8.954671  8.279096 10.385299
>> $M2
>>   [1]  9.358691 18.657771  3.033461 11.193338 10.385299 11.233078  2.417496
>>   [8] 10.021019 10.100497 19.796975 19.459188
>> $M3
>>   [1] 27.691922 13.895635 26.824272 17.909342 19.128024 21.730973  6.206010
>>   [8] 24.214702 11.531125 13.617458 19.717496  9.305704
>> $P3
>> [1]  9.669985 18.392840
>> $P4
>> [1] 18.346478 10.504518  8.967917  4.291884 23.380168  9.014280
>>
>>
>> Thanks in advance
>> Ivan
>>
>>
>> Le 2/3/2010 10:22, Ivan Calandra a écrit :
>>      
>>> Hi!
>>>
>>> Looks like get() doesn't work. Here is what I do and what I get (still in
>>> the loop):
>>>
>>>        
>>>>   names(get(paste(names(file)[3], name.num, sep="_")))<-
>>>> levels(factor(file[[3]]))
>>>>          
>>> Error in names(get(paste(names(file)[3], name.num, sep = "_")))<-
>>> levels(factor(file[[3]])) :
>>> could not find function "get<-"
>>>
>>>        
>>>>   print(names(get(paste(names(file)[3], name.num, sep="_"))))  #4
>>>> iterations; I wanted to test this part
>>>>          
>>> NULL
>>> NULL
>>> NULL
>>> NULL
>>>
>>>
>>> Does anyone has an idea about it?
>>> Thanks
>>> Ivan
>>>
>>> Le 2/2/2010 19:38, Chris Campbell a écrit :
>>>        
>>>> On Tue, Feb 2, 2010 at 11:44, Ivan Calandra
>>>> <ivan.calandra at uni-hamburg.de>    wrote:
>>>>          
>>>>> Hi David,
>>>>>
>>>>> Thanks for your answer.
>>>>> But I don't really see how I can extend it with my real data.
>>>>> The thing is that I have more than 3 names and 1 value for each name.
>>>>> Moreover, each is different from one run to another. That is why I was
>>>>> trying with a modification of names(). Also to be noted is that I
>>>>> simplified
>>>>> the "name" in assign(); I actually have 2 other variables that will be
>>>>> pasted to create the name.
>>>>>
>>>>> Here is my code (I kept only what is important for that part):
>>>>> ----
>>>>> library(WRS)
>>>>> seq.num<- seq(7,10,1)        #column (variable) indexes to be used as
>>>>> numerical variables
>>>>>
>>>>> # fac2list() separates the data from file[,k] into groups from levels in
>>>>> file[3] and store into list mode.
>>>>> for(i in 1:length(seq.num)) {
>>>>>   k<- seq.num[i]
>>>>>   name.num<- names(file)[k]
>>>>>   assign(paste(names(file)[3], name.num, sep="_"), fac2list(file[,k],
>>>>> file[3]))
>>>>>   names(paste(names(file)[3], name.num, sep="_"))<-
>>>>> levels(factor(file[[3]]))  #that line doesn't work, but I would like
>>>>> something in this direction
>>>>> }
>>>>> ----
>>>>>            
>>>> Sounds like a job for 'get'.  Try this (untested):
>>>>
>>>> names(get(paste(names(file)[3], name.num, sep="_")))
>>>>
>>>> Good luck
>>>>
>>>>          
>>>>> Thanks in advance for your help.
>>>>> Regards,
>>>>> Ivan
>>>>>
>>>>>
>>>>>
>>>>> Le 2/1/2010 18:47, David Winsemius a écrit :
>>>>>            
>>>>>> On Feb 1, 2010, at 12:33 PM, Ivan Calandra wrote:
>>>>>>
>>>>>>              
>>>>>>> I have a follow-up question:
>>>>>>>
>>>>>>> I use assign() to store some value in my paste()-created object as
>>>>>>> suggested:
>>>>>>> for (i in 1:3) {
>>>>>>> assign(paste("object", i, sep=""), c("a", "b", "c"))
>>>>>>> }
>>>>>>>
>>>>>>> Then I would like to change the names of the elements of that object
>>>>>>> within the loop. Since it is all in a loop, I cannot give the name of
>>>>>>> the
>>>>>>> object manually by doing something like: names(object1)<- c("tooth",
>>>>>>> "bone", "species").
>>>>>>> The only thing I can give to names() is paste("object", i, sep=""),
>>>>>>> which
>>>>>>> doesn't work.
>>>>>>>
>>>>>>> Any idea of how to do it?
>>>>>>> for (i in paste("object", 1:3, sep="")) {
>>>>>>>                
>>>>>> + assign(i, c("tooth"="a", "bone"="b", "species"="c") )
>>>>>> + }
>>>>>>              
>>>>>>> object1
>>>>>>>                
>>>>>>   tooth    bone species
>>>>>>     "a"     "b"     "c"
>>>>>>
>>>>>>              
>>>>>>> Thanks in advance
>>>>>>> Ivan
>>>>>>>
>>>>>>>
>>>>>>> Le 2/1/2010 17:14, David Winsemius a écrit :
>>>>>>>                
>>>>>>>> Upon reading it yesterday, it appeared as it would have required some
>>>>>>>> serious testing and there was no data on which to do any work.  You
>>>>>>>> were
>>>>>>>> clearly not taking the time to isolate the problem and construct a
>>>>>>>> dataset.
>>>>>>>> But who knows? When you say "What I want to do is. ... ,I would like
>>>>>>>> the
>>>>>>>> name of the list to be created in the loop too", maybe all you needed
>>>>>>>> was to
>>>>>>>> be pointed to was:
>>>>>>>>
>>>>>>>> ?assign
>>>>>>>>
>>>>>>>> But if that were the case, then you lost most of your audience along
>>>>>>>> the
>>>>>>>> way with a bunch of unneeded and obscure code.
>>>>>>>>
>>>>>>>>                  
>>>>>> David Winsemius, MD
>>>>>> Heritage Laboratories
>>>>>> West Hartford, CT
>>>>>>
>>>>>>
>>>>>>              
>>>>> ______________________________________________
>>>>> 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.
>>>>>
>>>>>            
>>>        
>> --
>> Ivan CALANDRA
>> PhD Student
>> University of Hamburg
>> Biozentrum Grindel und Zoologisches Institut und Museum
>> Martin-Luther-King-Platz 3
>> D-20146 Hamburg, GERMANY
>> +49(0)40 42838 6231
>> ivan.calandra at uni-hamburg.de
>>
>> **********
>> http://www.for771.uni-bonn.de
>> http://webapp5.rrz.uni-hamburg.de/mammals/eng/mitarbeiter.php
>>
>>
>> ______________________________________________
>> 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.
>>
>>
>>      
>
>
>    

-- 
Ivan CALANDRA
PhD Student
University of Hamburg
Biozentrum Grindel und Zoologisches Institut und Museum
Martin-Luther-King-Platz 3
D-20146 Hamburg, GERMANY
+49(0)40 42838 6231
ivan.calandra at uni-hamburg.de

**********
http://www.for771.uni-bonn.de
http://webapp5.rrz.uni-hamburg.de/mammals/eng/mitarbeiter.php



More information about the R-help mailing list