Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Order every tables the same way

I would like to order several tables by rowname with the same order of rowname, based for example on a vector.

My problem is that I don’t want to order alphabetically, but rather with a specific order.

Also, every table do not have the same size nor rownames, but still, they should follow the same order with their remaining rownames.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Reproducible example

### Initiating data
# Complete table with unordered rownames
tabComplete <- data.frame(Group=c("E", "A", "D", "B", "C"),
                          Values=c("order", "This", "correct", "is", "the"), 
                          row.names=c("Fifth", "First", "Fourth", "Second", "Third"))

           Group Values
Fifth      E order
First      A This
Fourth     D correct
Second     B is
Third      C the

# Two tables that I would like to order by rownames
tabPortion1 <- tabComplete[c(1, 3, 5), ]
tabPortion2 <- tabComplete[c(1, 2, 4), ]
    
       Group  Values
Fifth      E   order
Fourth     D correct
Third      C     the
    
       Group Values
Fifth      E  order
First      A   This
Second     B     is

What I would like to achieve

# Based on a vector, I would like that every table follow the same order but the have different sizes
vecMyOrder <- c("First", "Second", "Third", "Fourth", "Fifth")

# Tables with the correct order
tabComplete[c("First", "Second", "Third", "Fourth", "Fifth"), ]
tabPortion1[c("Third", "Fourth", "Fifth"), ]
tabPortion2[c("First", "Second", "Fifth"), ]

       Group  Values
First      A    This
Second     B      is
Third      C     the
Fourth     D correct
Fifth      E   order

       Group  Values
Third      C     the
Fourth     D correct
Fifth      E   order

       Group Values
First      A   This
Second     B     is
Fifth      E  order

Thank you

>Solution :

Given a list of dataframes lst <- list(tabComplete, tabPortion1, tabPortion2), you can try this

lapply(
    lst,
    \(x) x[order(match(row.names(x), vecMyOrder)), ]
)

or

lapply(
    lst,
    \(x) x[order(factor(row.names(x), levels = vecMyOrder)), ]
)

which gives

[[1]]
       Group  Values
First      A    This
Second     B      is
Third      C     the
Fourth     D correct
Fifth      E   order

[[2]]
       Group  Values
Third      C     the
Fourth     D correct
Fifth      E   order

[[3]]
       Group Values
First      A   This
Second     B     is
Fifth      E  order
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading