How do I transpose a tibble() in R

31,832

Solution 1

As Sotos has mentioned it, you just need to re-declare your matrix as a tibble:

as_tibble(cbind(nms = names(df), t(df)))

Solution 2

Solution here: https://stackoverflow.com/a/28917212/3880322

library(dplyr)
library(tidyr)
df %>%
    gather(key = var_name, value = value, 2:ncol(df)) %>% 
    spread_(key = names(df)[1],value = 'value')

Solution 3

I was faced with the same problem and tried all the above-mentioned solutions and realized that none of them actually preserve the names of the columns.

Here is, in my opinion, a better way to do the same:

# attaching needed libraries
library(dplyr)
library(data.table)
library(tibble)
# defining the dataframe
df <- cbind.data.frame(x = rnorm(10), y = rnorm(10))
# custom function to transpose while preserving names
transpose_df <- function(df) {
  t_df <- data.table::transpose(df)
  colnames(t_df) <- rownames(df)
  rownames(t_df) <- colnames(df)
  t_df <- t_df %>%
    tibble::rownames_to_column(.data = .) %>%
    tibble::as_tibble(.)
  return(t_df)
}
# using the function
transpose_df(df)
#> # A tibble: 2 x 11
#>   rowname    `1`   `2`     `3`    `4`      `5`   `6`    `7`    `8`    `9`
#>   <chr>    <dbl> <dbl>   <dbl>  <dbl>    <dbl> <dbl>  <dbl>  <dbl>  <dbl>
#> 1 x       -1.38  0.752  1.22    0.296 -0.00298 1.50  -0.719 -0.503 -0.114
#> 2 y        0.618 0.304 -0.0559 -1.27   0.0806  0.156  0.522  0.677  0.532
#> # ... with 1 more variable: `10` <dbl>

Created on 2018-02-17 by the reprex package (v0.2.0).

Share:
31,832

Related videos on Youtube

Alex
Author by

Alex

Data Scientist | Forecaster Life is uncertain, eat your dessert first.

Updated on July 09, 2022

Comments

  • Alex
    Alex 6 months

    In R the t() function is really meant for matrices. When I try to transpose my tibble with t() I end up with a matrix. A matrix can't be made into a tibble with tibble(). I end up spending time storing column names as variables and attaching them as I try to re-make a transposed version of my tibble.

    Question: What is the simplest way to transpose a tibble where the first column should become the column names of the new tibble and the old column names become the first column of my new tibble.

    • Sotos
      Sotos almost 6 years
      as_tibble(cbind(nms = names(df), t(df)))
  • Leo
    Leo over 1 year
    This did not work for me and added the original column of rownames as an additional, unwanted row in the resulting tibble, and not as the names of the columns like it should.

Related