Home > Blockchain >  Why my function always mistakenly returns a transposed matrix as output?
Why my function always mistakenly returns a transposed matrix as output?

Time:01-26

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:

  1. 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?
  2. Why does changing the cbind in the desc_n function to rbind returns the exact same results?

Again, any help is appreciated. Thank you.

CodePudding user response:

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 length n, and simplify is TRUE, then apply returns an array of dimension c(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.

  •  Tags:  
  • Related