ifreak
ifreak

Reputation: 1756

sort a data frame manually using non numeric column

i have the following data frame

    dd <- data.frame(b = c("High", "Medium", "Highest", "Low", "Not bad","Good", "V. Good"),
   x = c("C3", "C1", "C4", "N2", "C2", "N1","N4"), x = c("5", "2", "3", "6", "7", "5","7") )

so i want the data frame to be transformed using a manual order for the variable X.

for example: that's the original one

1    High C3   5
2  Medium C1   2
3 Highest C4   3
4     Low N2   6
5 Not bad C2   7
6    Good N1   5
7 V. Good N4   7

but what i want is a new data frame to begin based on the value of X but not alphabetically, but randomly in an order which i chose e.g:

the first row has x=C1, the second have x=C2, the third have x=N4, ...etc

how this can be done??

thank you

Upvotes: 8

Views: 14123

Answers (2)

Vincent Zoonekynd
Vincent Zoonekynd

Reputation: 32361

Since the x column is a factor, you can simply ensure that its levels are in the order you want.

# New sorting order
desired_order <- sample(levels(dd$x))
# Re-order the levels
dd$x <- factor( as.character(dd$x), levels=desired_order )
# Re-order the data.frame
dd <- dd[order(dd$x),]

Upvotes: 16

tim riffe
tim riffe

Reputation: 5691

If your data.frame really is small enough to manually reorder, then just make a vector of the numbers 1:7, ordered in the way that the rows should appear. e.g.:

    dd[c(2,5,7,1,4,3,6),]

    b  x x.1
    2  Medium C1   2
    5 Not bad C2   7
    7 V. Good N4   7
    1    High C3   5
    4     Low N2   6
    3 Highest C4   3
    6    Good N1   5

Or, if you really want to do it with a character vector, you can also reference by row names, like this:

    rownames(dd) <- as.character(dd$x)
    dd[c("C1","C2","N4","C3","N2","C4","N1"),]

    b  x x.1
    C1  Medium C1   2
    C2 Not bad C2   7
    N4 V. Good N4   7
    C3    High C3   5
    N2     Low N2   6
    C4 Highest C4   3
    N1    Good N1   5

Upvotes: 2

Related Questions