The `data.table` package might be useful to you. `data.table` works mostly by reference. Especially when assigning and modifying columns. Especially if you are hitting RAM limits, the efficiencies in data.table are dramatic Additionally, data.table has built into the functionality of `with` `within` `by` `subset` etc, making calls much shorter and code more readable. For example, the cummbersome statement above could be simplified to something like: aDTofItems[attribute1 & attribute2==6 & attribute3=="C", # filter attribute4 := attribute5 * attribute6] # assign Furthermore, if the attributes you are filtering on are the `key` of the table, then the line is even shorter: aDTofItems[.(TRUE, 6, "C"), # filter attribute4 := attribute5 * attribute6] # assign Assuming the structure of each element is comparable, you can coerce your list into a data.table using aDTofItems <- rbindlist(aListOfItems) # note, if you have factors in your list you should convert them to character before calling rbindlist # or similarly, although a bit slower aDTofItems <- data.table(do.call(rbind, aListOfItems))