'Calculating the mean by name of a named numeric returing another named numeric as a result

I am working on a code which has a for loop. At the end of each iteration, a named numeric vector is concatenated to the one of the previous loop.

all_obj <- c()
for (i in 1:3){
  obj <- 1:3*i
  names(obj) <- c('foo', 'baz', 'bar')
  all_obj <- c(all_obj, obj)
}

At the end, all_obj looks like this:

foo baz bar foo baz bar foo baz bar 
  1   2   3   2   4   6   3   6   9 

What I would need now is to have a result which is the mean by name of this vector, and it is a named numeric itself.

Expected result

foo baz bar
  2   4   6

I know I can get the values with name foo (for example) with all_obj[names(all_obj) == "foo"]. But I am bit stuck as to how would I reach my desired result from here without having to convert the data too much (e.g. avoiding doing as.data.frame for instance). Not that there is anything wrong with this, it's just a matter of preference and curiosity.

This was my best attempt so far.

lapply(unique(names(all_obj)), function(x) mean(all_obj[names(all_obj) == x]))
#[[1]]
#[1] 2
#
#[[2]]
#[1] 4
#
#[[3]]
#[1] 6
r


Solution 1:[1]

An other way in base R is to split all_obj according to names, and calculate mean for each group using sapply.

sapply(split(all_obj, names(all_obj)), mean)
bar baz foo 
  6   4   2 

Solution 2:[2]

Sorry, this was very easy....

I am posting the solution here so that it hopefully help anyone with my same requirement.

sapply(unique(names(all_obj)), function(x) mean(all_obj[names(all_obj) == x]))

Result

foo baz bar 
  2   4   6 

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 umbe1987