Issue
I am basically a beginner in R and my question most likely has a very basic answer but after many tries I just can’t figure out the reason why my function always returns a transposed output. Any help is much appreciated. I am using the Rstudio IDE, R 4.1.2.
My goal was to write a function to add two additional columns to any given dataframe, which correspond to mean and maximum of each row, respectively.
So I created a sample dataframe:
a <- c(1:10)
b <- c(11:20)
c <- c(21:30)
df <- data.frame(a,b,c)
Then I wrote the following function:
desc_n <- function(x){
return(cbind(
mean(x, na.rm=T),
max(x,na.rm=T))
)
}
After that I use the apply() function to apply my newly defined desc_n function to every row of the df dataframe.
n_df <- apply(df, 1, desc_n)
However, while the output is correct mathematically, it is transposed. Output:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 11 12 13 14 15 16 17 18 19 20
[2,] 21 22 23 24 25 26 27 28 29 30
While I expected it to be 10 rows and 2 columns. No matter what I do, the output remains the same. I know how to transpose the output to my preference, but this is mostly a learning example for me.
So I have 2 questions:
- Why does the desc_n function returns a [2,10] output while I used cbind in it? Shouldn’t it return a [10,2] output?
- Why does changing the cbind in the desc_n function to rbind returns the exact same results?
Again, any help is appreciated. Thank you.
Solution
Your result is assembled by apply
, and it’s apply
that shapes the output (using, of course, your desc_n
function along the way).
From the ?apply
help page:
If each call to
FUN
returns a vector of lengthn
, andsimplify
isTRUE
, thenapply
returns an array of dimensionc(n, dim(X)[MARGIN])
Whichever way you bind it, your desc_n
function returns something of length 2, so you get 2 rows in the apply-simplified output.
Answered By – Gregor Thomas
Answer Checked By – Marilyn (BugsFixing Volunteer)