Other questions using "table" in their title are actually using data frame.
I want to keep this strictly about table
object.
Suppose I have tables with same structure that I want to find the average of.
For example:
test1 <- head(table(iris$Sepal.Length, iris$Species))
(test1 test1 test1) / 3
> (test1 test1 test1) / 3
setosa versicolor virginica
4.3 1 0 0
4.4 3 0 0
4.5 1 0 0
4.6 4 0 0
4.7 2 0 0
4.8 5 0 0
However, it cannot be done by:
> mean(c(test1,test1,test1))
[1] 0.8888889
> sum(c(test1,test1,test1)) / 3
[1] 16
Best approach I could find was to make the objects into a list of tables and use Reduce
function:
Reduce(` `, list(test1, test1, test1)) / 3
Is there more simpler way to do it without going back and forth using list
object?
CodePudding user response:
We may loop over the array
in the 1st two dimensions and get the mean
apply(replicate(3, test1), 1:2, mean, na.rm = TRUE)
-output
setosa versicolor virginica
4.3 1 0 0
4.4 3 0 0
4.5 1 0 0
4.6 4 0 0
4.7 2 0 0
4.8 5 0 0
Or loop over a single dimension and get the rowMeans/colMeans
apply(replicate(3, test1), 2, rowMeans, na.rm = TRUE)
setosa versicolor virginica
4.3 1 0 0
4.4 3 0 0
4.5 1 0 0
4.6 4 0 0
4.7 2 0 0
4.8 5 0 0
Both these methods are better than the Reduce
approach with
especially when there are missing values as na.rm
argument is found in both mean
and rowMeans/colMeans
NOTE: replicate
is used to create an array
by replicating the object 'test1' n
times.
If the object is already a list
of table
s, then convert to array
with simplify2array
before applying the apply
apply(simplify2array(list(test1, test1, test1)), 1:2, mean, na.rm = TRUE)
setosa versicolor virginica
4.3 1 0 0
4.4 3 0 0
4.5 1 0 0
4.6 4 0 0
4.7 2 0 0
4.8 5 0 0