Phil Smith
Phil Smith

Reputation: 454

How to rearrange columns of a data frame based on values in a row

This is an R programming question. I would like to rearrange the order of columns in a data frame based on the values in one of the rows. Here is an example data frame:

df <- data.frame(A=c(1,2,3,4),B=c(3,2,4,1),C=c(2,1,4,3),
  D=c(4,2,3,1),E=c(4,3,2,1))

Suppose I want to rearrange the columns in df based on the values in row 4, ascending from 1 to 4, with ties having the same rank. So the desired data frame could be:

df <- data.frame(B=c(3,2,4,1),D=c(4,2,3,1),E=c(4,3,2,1),
  C=c(2,1,4,3),A=c(1,2,3,4))

although I am indifferent about the order of first three columns, all of which have the value 1 in column 4.

I could do this with a for loop, but I am looking for a simpler approach. Thank you.

Upvotes: 2

Views: 432

Answers (1)

akrun
akrun

Reputation: 886948

We can use select - subset the row (4), unlist, order the values and pass it on select

library(dplyr)
df %>% 
    select(order(unlist(.[4, ])))

-output

  B D E C A
1 3 4 4 2 1
2 2 2 3 1 2
3 4 3 2 4 3
4 1 1 1 3 4

Or may use

df %>% 
     select({.} %>%
              slice_tail(n = 1) %>%
              flatten_dbl %>% 
              order)
  B D E C A
1 3 4 4 2 1
2 2 2 3 1 2
3 4 3 2 4 3
4 1 1 1 3 4

or in base R

df[order(unlist(tail(df, 1))),]

Upvotes: 1

Related Questions