[R] Looping through R objects with $ operator and tags

Vivek Ayer vivek.ayer at gmail.com
Fri Jul 31 00:53:24 CEST 2009


I figured it out. I understand that R isn't really meant to do this.
Essentially, I want to have an object per read csv file which contains
columns. But I'm dealing with hundreds of files in a folder and I
wanted to automate the importing into R and process stuff without
entering the shell and using lists, lapply, and sapply.

I realized there's an more convenient indexing symbol for these kind
of functions, namely "[[ , ]]"

So I did something like this:

for (i in c(1:num)) {
	tempobj <- get(paste(id,i,sep=""));
	TotLogDist <- c(TotLogDist,tempobj[["LogDist"]])
}

where num is now ~100 or 1000.

Thanks for the tips! I'm still a newbie in R, and hopefully I can
learn to be more efficient next time.

Thanks again,
Vivek

On Thu, Jul 30, 2009 at 3:01 PM, Phil Spector<spector at stat.berkeley.edu> wrote:
> Vivek -
>   In R, you shouldn't be storing related objects in
> individual vectors or data frames, you should put them in
> a list.  Frankly, I don't know what you're trying to
> acheive with the code fragment you sent, so I don't really
> know what to tell you, but it's usually not a good idea in R to have to
> paste together strings to access a variable.
>                                               - Phil
>
>
> On Thu, 30 Jul 2009, Vivek Ayer wrote:
>
>> How I loop object placement into a list?
>>
>> for (i in c(1:10))
>> list(paste("object",i,sep=""))
>> ??
>>
>> Kind of confused. This would be useful for functions like c() as well.
>>
>> Thanks,
>> Vivek
>>
>> btw...I stop by 5th floor Evans every once in a while!
>>
>> On Thu, Jul 30, 2009 at 9:33 AM, Phil Spector<spector at stat.berkeley.edu>
>> wrote:
>>>
>>> Vivek -
>>>   First, put your objects in a list where they belong:
>>>
>>> myobjects = list(object1,object2,object3)
>>>
>>> Now you can use the power of R to do your work:
>>>
>>> myobjects = lapply(myobjects,transform,logDist = log10(Distance))
>>>
>>>                                       - Phil Spector
>>>                                         Statistical Computing Facility
>>>                                         Department of Statistics
>>>                                         UC Berkeley
>>>                                         spector at stat.berkeley.edu
>>>
>>> P.S. -  If you really want to do things with loops, get, assign, etc.
>>> you could do something like this:
>>>
>>> for(i in 1:10){
>>>    objname = paste('object',i,sep='')
>>>    now = get(objname)
>>>    assign(objname,transform(now,logDist = log10(distance)))
>>> }
>>>
>>> But please try to remember that R provides lists and functions like
>>> lapply and sapply for a reason.
>>>
>>> On Thu, 30 Jul 2009, Vivek Ayer wrote:
>>>
>>>> Hi all,
>>>>
>>>> Suppose I want to set the values in a column to the log of the values
>>>> of another column like so:
>>>>
>>>> object$LogDist <- log10(object$Distance)
>>>>
>>>> How do I loop through the objects if I have object1, object2, etc to
>>>> perform this function?
>>>>
>>>> object1$LogDist <- log10(object1$Distance)
>>>> object2$LogDist <- log10(object2$Distance)
>>>> object3$LogDist <- log10(object3$Distance)
>>>>
>>>> I was trying to use the assign and paste functions like so:
>>>>
>>>> for (i in c(1:10))
>>>>
>>>>
>>>> assign(paste("object",i,"$LogDist"),log10(as.name(paste("object",i,"$LogDist")))
>>>>
>>>> but that didn't work out. It creates objects with whole name
>>>> object1$LogDist instead of just manipulating the column that's part of
>>>> that object.
>>>>
>>>> Help appreciated,
>>>> Vivek
>>>>
>>>> ______________________________________________
>>>> 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