Here is a solution. The main point is that the last column is a matrix column, not several vectors, one per statistic computed in aggregate
.
Note that the way to extract the results matrix is absolutely general, this column is always the last one and therefore it's column number is always ncol(temp)
.
The following post is relevant: Difference between [
and [[
# make up a test data set
df1 <- mtcars[c("mpg", "cyl", "am")]
# it's not strictly needed to coerce the
# grouping columns to factor
df1$cyl <- factor(df1$cyl)
df1$am <- factor(df1$am)
names(df1) <- c("AUClast", "RIC", "STUD")
# exact same code as the question's
temp <- aggregate(AUClast ~ RIC + STUD, df1,
FUN = function(x)
c(N = length(x),
Mean = mean(x),
SD = sd(x),
Median = median(x),
Min = min(x),
Max = max(x)
))
# see the result
temp
#> RIC STUD AUClast.N AUClast.Mean AUClast.SD AUClast.Median AUClast.Min
#> 1 4 0 3.0000000 22.9000000 1.4525839 22.8000000 21.5000000
#> 2 6 0 4.0000000 19.1250000 1.6317169 18.6500000 17.8000000
#> 3 8 0 12.0000000 15.0500000 2.7743959 15.2000000 10.4000000
#> 4 4 1 8.0000000 28.0750000 4.4838599 28.8500000 21.4000000
#> 5 6 1 3.0000000 20.5666667 0.7505553 21.0000000 19.7000000
#> 6 8 1 2.0000000 15.4000000 0.5656854 15.4000000 15.0000000
#> AUClast.Max
#> 1 24.4000000
#> 2 21.4000000
#> 3 19.2000000
#> 4 33.9000000
#> 5 21.0000000
#> 6 15.8000000
# the error
colnames(temp) <-c("Renal Function", "Study", "N", "Mean", "SD", "Median", "Min", "Max")
#> Error in names(x) <- value: 'names' attribute [8] must be the same length as the vector [3]
# only three columns, the last one is a matrix
# this matrix is the output of the anonymous function
# aggregate applies to the data.
str(temp)
#> 'data.frame': 6 obs. of 3 variables:
#> $ RIC : Factor w/ 3 levels "4","6","8": 1 2 3 1 2 3
#> $ STUD : Factor w/ 2 levels "0","1": 1 1 1 2 2 2
#> $ AUClast: num [1:6, 1:6] 3 4 12 8 3 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : NULL
#> .. ..$ : chr [1:6] "N" "Mean" "SD" "Median" ...
# three columns
(nc <- ncol(temp))
#> [1] 3
# extract the 3rd column temp[[nc]], not the data.frame temp[nc]
# and bind it with the other columns. It is also important
# to notice that the method called is cbind.data.frame,
# since temp[-nc] extracts a data.frame. See the link above.
temp <- cbind(temp[-nc], temp[[nc]])
# not needed anymore!
# colnames(temp) <-c("Renal Function", "Study", "N", "Mean", "SD", "Median", "Min", "Max")
temp
#> RIC STUD N Mean SD Median Min Max
#> 1 4 0 3 22.90000 1.4525839 22.80 21.5 24.4
#> 2 6 0 4 19.12500 1.6317169 18.65 17.8 21.4
#> 3 8 0 12 15.05000 2.7743959 15.20 10.4 19.2
#> 4 4 1 8 28.07500 4.4838599 28.85 21.4 33.9
#> 5 6 1 3 20.56667 0.7505553 21.00 19.7 21.0
#> 6 8 1 2 15.40000 0.5656854 15.40 15.0 15.8
Created on 2023-05-06 with reprex v2.0.2
The assignment of new colnames
is only needed to make the first two columns' names more descriptive, not to get rid of the AUClast.
prefix.